<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="applicationComplete()" layout="absolute" pageTitle="push" backgroundColor="#000"> <mx:Script> <![CDATA[ import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.filters.DropShadowFilter; import flash.filters.GlowFilter; import mx.controls.Alert; import mx.controls.VideoDisplay; import mx.utils.URLUtil; private var camWidth:Number = 320; private var camHeight:Number = 240; private var _camera:Camera = null; private var quality:Number = 0; private var PADDING_HORIZONTAL:Number = 6; private var PADDING_VERTICAL:Number = 29; private var _minWidth:int = 160 + PADDING_HORIZONTAL; private var _minHeight:int = 120 + PADDING_VERTICAL; private var aspectRatio:Number = 4/3; private var cameraConf:Object; private var videoConf:Object; private var liveStreamName:String="a"; private var nc:NetConnection; private var ns:NetStream; private var mic:Microphone; private var _netConnection:NetConnection; private var uri:String="rtmp://需要推流ip可以找我 qq:626776246 /myapp"; private var camIndex:String="0";//默认为第一个摄像头 private var camIndexInt:int=-1;//大于0小于摄像头个数时以此值控制选择摄像头 否则由开始装载swf文件传入的参数为准 如也未传入默认取系统第一个摄像头 private var _avatarURL:String; private var displayAvatar:Boolean = false; private var loader:Loader = new Loader(); private var request:URLRequest; private var avatarWidth:Number = 320; private var avatarHeight:Number = 240; private var filtersArray:Array; private var jsParam:Object; private function applicationComplete():void { Security.allowDomain("*"); initExternalInterface(); if (stage) { jsParam = stage.loaderInfo.parameters; if(jsParam){ if(jsParam.uri != null) uri = jsParam.uri; if(jsParam.sn != null) liveStreamName = jsParam.sn; debug("as_uri= "+jsParam.uri); debug("as_sn= "+jsParam.sn); } } ExternalInterface.call("getCamInfoCallback", Camera.names); startPush({"camIndex":0}); } public function displayCamera():void { var cl: int = Camera.names.length ; if ( cl == 0) { Alert.show("未找到摄像头"); return; } if(camIndexInt > 0){ if(camIndexInt < cl){ camIndex=""+camIndexInt; } else{ Alert.show("startPush方法传入的摄像头索引超出系统当前可用摄像头个数"); } } // camIndex = "0"; debug("准备获取第"+camIndex+"个摄像头"); _camera = Camera.getCamera(camIndex); if (_camera == null) { debug("获取第"+camIndex+"摄像头为空"); return; } _camera.setMotionLevel(5, 1000);// // _camera.setKeyFrameInterval(15); _camera.setMode(640, 480, 25); _camera.setQuality(0, 90); mic = Microphone.getMicrophone(); mic.encodeQuality = 10; mic.rate = 44; mic.setSilenceLevel(20,200); var soundTrans:SoundTransform = new SoundTransform(); soundTrans.volume = 0.6; mic.soundTransform=soundTrans; ns = new NetStream(nc);//Error #2044: 未处理的 NetStatusEvent:。 level=error, code=NetStream.Publish.BadName 同一地址重复推流 ns.attachCamera(_camera); ns.attachAudio(mic); ns.publish(liveStreamName,"live"); debug("liveStreamName="+liveStreamName); videoDisplay.mx_internal::videoPlayer.bufferTime = 1; videoDisplay.source = uri + "/" + liveStreamName; videoDisplay.play(); // appFilter(videoDisplay); } private function initExternalInterface():void { if (ExternalInterface.available) { ExternalInterface.addCallback("startPush", startPush); // ExternalInterface.addCallback("stopPush", stopPush); ExternalInterface.addCallback("appFilter", appFilter); ExternalInterface.addCallback("removeFilter", removeFilter); } } public function startPush(optConfig:Object):void{ nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); nc.client = this; if(uri == null){ Alert.show("推流地址为空"); } nc.connect(uri); if(optConfig != null && !isNaN(optConfig.camIndex)) camIndexInt = optConfig.camIndex; } private function onNetStatus(event:NetStatusEvent):void{ debug(event.info.code); switch(event.info.code){ case "NetConnection.Connect.Success": displayCamera(); break; case "NetConnection.Connect.Failed": debug("Failed"); break; case "NetConnection.Connect.AppShutDown": debug("AppShutDown"); break; case "NetConnection.Connect.NetworkChange": debug("NetworkChange"); break; case "NetConnection.Connect.Closed": debug("Closed"); ExternalInterface.call("pushreconnect"); break; } } public function debug(param:String):void { // Alert.show(param); ExternalInterface.call("debug", param); } public function onBWDone():void{ }//不可删除 public function displayPublishingVideo():void{ } private function determineHTMLURL():String { var serverName:String = "*"; if(ExternalInterface.available) { try { var htmlURL:String = String(ExternalInterface.call("window.location.href.toString")); serverName = URLUtil.getServerName(htmlURL); } catch(s:Error) { debug(s.getStackTrace()); } } return serverName; } /** * ActionScript 3.0 包括 9 个可用于显示对象和 BitmapData 对象的滤镜类: ■ 斜角滤镜 ( BevelFilter 类) ■ 模糊滤镜 ( BlurFilter 类) ■ 投影滤镜 ( DropShadowFilter 类) ■ 发光滤镜 ( GlowFilter 类) ■ 渐变斜角滤镜 ( GradientBevelFilter 类) ■ 渐变发光滤镜 ( GradientGlowFilter 类) ■ 颜色矩阵滤镜 ( ColorMatrixFilter 类) ■ 卷积滤镜 ( ConvolutionFilter 类) ■ 置换图滤镜 ( DisplacementMapFilter 类) */ public function appFilter(_videoDisplay:VideoDisplay):void { var bitmapData:BitmapData=new BitmapData(200,200,false,0xFF009900); var displayobject:Bitmap=new Bitmap(bitmapData); addChild(displayobject); displayobject.x=130; displayobject.y=80; var dropShadow:DropShadowFilter=new DropShadowFilter(); //创建bitmapData对象并将它呈现在屏幕上 var bitmapData2:BitmapData=new BitmapData(200,200,false, 0xFF009901); var displayobject2:Bitmap=new Bitmap(bitmapData2); addChild(displayobject2); //设置位置 displayobject2.x=130; displayobject2.y=80; //创建滤镜实例 var glowFilter:GlowFilter=new GlowFilter(0x0000FF); //创建滤镜数组,通过将滤镜作为参数传递给Array()构造函数, //将该滤镜添加到数组中 //创建bitmapData对象并将它呈现在屏幕上 var bitmapData3:BitmapData=new BitmapData(200,200,false,0x0000FF); var displayobject3:Bitmap=new Bitmap(bitmapData3); addChild(displayobject3); //设置位置 displayobject3.x=130; displayobject3.y=80; //创建滤镜实例 var blurX:Number=30; var blurY:Number=30; var gradientBevelFilter:BlurFilter=new BlurFilter(blurX,blurY,BitmapFilterQuality.HIGH); // filtersArray =new Array(dropShadow,glowFilter); filtersArray =new Array(glowFilter); _videoDisplay.filters = filtersArray; debug("appFilter"); } public function removeFilter():void { filtersArray = new Array(); // _videoDisplay.filters = filtersArray; debug("removeFilter"); } ]]> </mx:Script> <mx:VideoDisplay x="0" y="0" width="100%" height="100%" id="videoDisplay"></mx:VideoDisplay> </mx:Application>