<?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>
相关推荐
这个项目可能包括了ActionScript代码,用于处理视频捕捉、编码、推流以及与服务器的交互。此外,可能还包括了服务器配置信息和部署指南,帮助用户将这个直播推流系统运行在自己的服务器上。 需要注意的是,随着...
simplest_as3_rtmp_streamer:最简单的RTMP推流器(基于ActionScript) rtmp_sample_player_adobe:从Adobe Flash Media Sever提取出来的测试播放器 rtmp_sample_player_wowza:从Wowza服务器中提取出来的测试播放器 ...
在直播场景中,视频源(如摄像头)捕获的音视频数据会被编码并推送到RTMP服务器,然后服务器将这些数据分发给订阅的客户端。客户端通过RTMP协议接收数据并在本地解码播放。 FLEX是一种基于ActionScript 3的开放源...
2. 创建RTMP流:将视频内容推送到服务器,生成一个RTMP URL。 3. 配置`rtmpVideoPlayer`:在HTML文件中嵌入Flash Player,并设置RTMP URL参数,使其指向之前创建的流。 4. 测试播放:在浏览器中打开HTML页面,`...
它允许内容发布者向服务器推送数据流,而服务器再将这些流推送给客户端。OFLA(Open Flash Live Audio)是Red5对RTMP协议的一个实现,主要用于音频和视频的实时传输。 流媒体服务器如Red5对于在线教育、视频会议、...
开发者通常会使用编码器将视频源(如摄像头输入)编码成RTMP兼容的格式,然后推送到RTMP服务器。在Flash Builder中,NetStream对象同样扮演关键角色,它负责接收服务器推送的流并将其呈现给用户。 关于标签中的"FLV...
在FMS中,你可以创建RTMP流,将媒体文件推送到服务器,或者从服务器拉取流数据。 四、FMS应用开发 1. ActionScript API:FMS提供了ActionScript API,使得开发者可以使用Flash Player或Adobe AIR编写客户端应用程序...
RTMP是一种广泛用于在线流媒体传输的协议,由Adobe Systems开发,主要用于将音视频数据实时推送到服务器,然后由服务器分发给客户端。Red5 Server就是实现了RTMP协议的一个服务器端软件,它支持流媒体的录制、播放、...
5. **流媒体处理**:了解流媒体的基本概念,如推流和拉流,以及如何处理流的编码、解码和转换,这对于创建有效的Red5应用至关重要。 6. **服务器配置**:设置和管理Red5服务器,包括安装、配置服务器端的流媒体存储...
2. **推流**:编码后的视频流通过RTMP(Real-Time Messaging Protocol)协议推送到服务器。RTMP是Flash专为实时流媒体设计的协议,它允许低延迟的数据传输,非常适合直播应用。 3. **服务器处理**:服务器接收到...
Flash客户端可以捕获用户摄像头的视频流,然后通过RTMP协议推送到Red5服务器,其他客户端则可以从服务器拉取直播流观看。 2. 录制与回放:Red5支持媒体录制功能,允许客户端将接收到的流保存到服务器。这样,用户...
在实际应用中,RED5可以与其他工具配合使用,如FFmpeg进行视频编码和转换,或者Adobe Flash Media Live Encoder进行实时流推流。RED5还支持录制、播放、点播等功能,通过创建应用程序和自定义服务,可以实现更复杂的...
7. **直播功能实现**:直播涉及到捕捉、编码、推流到FMS服务器的过程。这可能需要第三方硬件或软件,如OBS Studio,开发者需要知道如何与这些工具集成,并处理延迟、稳定性等问题。 8. **安全性与版权保护**:包括...
3. **ActionScript客户端代码**:在`web`目录下,`client`子目录包含Flash ActionScript代码,用于与Red5服务器交互,如`oflaDemo.asc`文件,这是Flash客户端的主脚本,实现了推流、拉流等功能。 4. **Web资源**:`...
1. 实时流发布:FMS3支持RTMP协议,可将音视频内容实时推送到服务器,供多个用户同时观看。 2. 内容录制:服务器可以记录直播流,以便后续点播。 3. 内容存储与分发:FMS3支持存储流媒体内容,并通过边缘服务器分发...
RED5支持发布和订阅流,这意味着你可以将视频推送到服务器,或者从服务器拉取视频流。 为了在AS2中播放RED5服务器上的视频,你需要在RED5上部署一个流应用。这通常涉及到创建一个Application Mapping,指定一个应用...
推流是指将直播源发送到服务器的过程,而拉流则是客户端从服务器获取流媒体数据进行播放。这种功能使得Red5能与各种直播源(如摄像头、编码器等)配合,并为观看者提供稳定流畅的直播体验。 在实际使用中,Red5的...
RTMP(Real-Time Messaging Protocol)是一种广泛使用的协议,主要用于将音频、视频数据从服务器推送到客户端。RTMP协议以其低延迟特性而受到青睐,适合直播和在线游戏等实时性要求高的场景。Red5 Pro对RTMP的全面...
5. **流媒体处理**:Red5支持实时推流和拉流,可以实现视频直播。通过RTMP协议,客户端可以将视频流推送到服务器,然后由服务器分发给其他客户端。此外,Red5还支持视频录制,可以将直播内容保存到服务器上供后期...
例如,用户可以通过AS3将本地摄像头的视频流推送到RED5服务器进行录制: ```actionscript var publishName:String = "recordedVideo"; var recordStream:NetStream = new NetStream(nc); recordStream.publish...