本文作者:IMWeb ninawu 原文出处:IMWeb社区 未经同意,禁止转载
接触了一段时间的flash直播,无论是腾讯课堂‘数据生成模式’实现的直播还是第三方直播任务tcplayer通过拉流地址实现的直播,都存在一定的延时和首帧慢的情况。为了能更好的做好音视频监控和问题定位,便想自己实现一套flash直播简单的demo,在通过改变上行的带宽,码率,帧率,gop大小等信息来观察延时和首帧的情况。
实现flash直播需要三个重要的类,netconnection,netstream和video。 NetConnection 类在客户端和服务器之间创建双向连接。客户端可以是 Flash Player 或 AIR 应用程序。服务器可以是 Web 服务器、Flash Media Server、运行 Flash Remoting 的应用程序服务器或 Adobe Stratus服务。调用 NetConnection.connect() 以建立连接。使用 NetStream 通过该连接发送媒体流和数据
调用 NetConnection.connect() 会执行下列操作:
? 传递“null”会从本地文件系统或 Web 服务器播放视频和 MP3 文件。
? 传递“http”URL 可连接到运行 Flash Remoting 的应用程序服务器。可使用 NetServices 类通过 NetConnection 对象调用应用程序服务器函数,并返回结果。有关详细信息,请参阅 Flash Remoting 文档。
? 传递“rtmp/e/s”URL 可连接到 Flash Media Server 应用程序。
? 传递“rtmfp”URL 会为 RTMFP 客户端服务器、对等和 IP 多播通信创建双向网络端点。
? 传递字符串“rtmfp:”可为 RTMFP IP 多播通信创建无服务器的双向网络端点。 NetStream 类通过 NetConnection 打开了一个单向流通道。
? 调用 NetStream.play(),从本地磁盘、Web 服务器或 Flash Media Server 播放媒体文件。
? 调用 NetStream.appendBytes(),将 ByteArray 数据传入 NetStream。
protected function onProgress(e:ProgressEvent):void{
if(this._downLoadState==0)
this.\_downLoadState=1;
var tem:ByteArray=new ByteArray();
tem.endian=this.\_urlLoader.endian;
this.\_urlLoader.readBytes(tem);
this.\_ns.appendBytes(tem);
}
Video 类在应用程序中显示实时视频或录制视频,而无需在 SWF 文件中嵌入视频
?调用video.attachNetStream()指定要在应用程序中 Video 对象的边界内显示的视频流
下面的demo分别演示了通过appendbytes或拉流地址或直接连接媒体服务器来播放视频流。因暂未实现OBS推流,所以appendbytes和拉流地址播放的视频流并非直播视频流,后续加上OBS推流后,换成直播流即可。
演示地址:http://52.78.69.82/web/videoDemo/RTMPTest.html