求怎么做个摄像头的rtmp流媒体服务器器

基于S5pv210流媒体服务器的实现之网络摄像头 - 服务器技术综合 - 次元立方网 - 电脑知识与技术互动交流平台
基于S5pv210流媒体服务器的实现之网络摄像头
这里仅介绍流媒体服务器端的实现思路,及编码注意问题,不会贴代码的具体实现。直接入正题先介绍一下系统硬件框架:
服务器端连接PC机用VLC播放如下图:
服务器端应用程序可以分为图像采集、视频硬件编码压缩、RTP打包发送,三个部分。采用C++语言编程,引入C、C++语言混合共享库的方式实现。
图像采集模块主穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq4utTwytPGtcr9vt21xLLJvK+jrLKivauyybyvtb21xMr9vt3U3bTmtb1ERFIyxNq05tbQo6zX986q07K8/rHgwuvEo7/ptcTK/b7d1LSho0xpbnV4My4wLjjE2rrLz8LK08a1ssm8r8rHu/nT2lY0TDIoVmlkZW8gZm9yIExpbnV4IDIpv/K83Mq1z9a1xKOuVjRMMsrHTGludXjE2rrL1tC52NPaytPGtcnosbi1xNOm08OzzNDyvdO/2qOsy/zOqtL0ytPGtcnosbi1xNOm08OzzNDyseCzzMzhuanBy9K7zNe907/auea3tqOuzerJxrXEyePP8c23x/22r7D8uqzBy8njz/HNt9S0yv2+3dPrtKbA7cb307K8/sSjv+lGSU1DMLXEyv2+3bmyz+2jrNTdtOa1vUREUjLW0LXEyv2+3dS0o6y74b6tuf1GSU1DMNeqwuuzyU5WMTK48cq9o6zTptPDs8zQ8tbQv8nS1M2ouf1WNEwyzOG5qbXE06bTw7PM0PK907/awLS/2NbGRklNQzC1xNeqwuu48cq9oaPV4tH506bTw7PM0PK+zc3qs8nBy9a4tqjR1cmrv9W85LXEyrXKscrTxrWyybyvoaO5/bPMyOfNvM/CzbzL+cq+o7o8L3A+PHA+CQk8aW1nIHNyYz0="http://www.it165.net/uploadfile/files/216.jpg" alt="" />
完成原始视频数据采集后,需穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq9q8rTxrXTsrz+seDC69G5y/WzyUguMjY0o6zV4sDv0aHTw7XESC4yNjSjrNb30qrS8s6qy/yx4MLr0KfCyrjfoaLE3NLUvc+1zbXEyv2+3cvZwsq0q8vNu/nT2klQKM34vMrQrdLpKbXEytPGtcH3o6zU2srTxrXWysG/oaLRucv10KfCyrrNyv2+3bD8u9a4tLaqyqe1yLe9w+bT0L3PtPO1xNPFysajrMTcuty6w8rK06bS1Myrzfi0q8rko6zKx8S/x7C84L/Yz7XNs9fuzqrA7c/rtcTQxdS00bnL9bHgwuux6te8oaM8L3A+PHA+ICAgICAgICAgICAgICAgICAgseDC67n9s8zKx82ouf2199PDUzVQVjIxMLSmwO3G97XE07K8/rHgwuu1pdSqTUZDo6y21Neqwuu1w7W9tcROVjEyuPHKvbXEyv2+3b340NCx4MLr0bnL9bSmwO2ho9PJ09oyMTC1xE1GQ9ans9ZILjI2NKGiSC4yNjOholZDMaGiTVBFRzKhok1QRUc0tci24NbWytPGtbHgwuux6te8o6y2+MfSw7/W1rHgwuu48cq9ttTTprbg1+myzsr9v8m5qb+qt6LIy9Sx0aHU8aOsysrTprbg1tayu82su7e+s7bg1tbSqsfzz8K1xMrTxrWx4MLroaPOqsHLvvm64srTxrXWysG/us2zyc/xy9m2yKGj1NrIqLriv7zCx834wue0q8rkzPW8/rrNyePP8c23s8nP8dbKwb+686Os0OjSqtGh1PHKytbQtcRNRkOx4MLrxvfGt9bK0vLK/aOs1eLR+dTasaPWpLjfxrfWykguMjY0zbzP8dG5y/W1xMewzOHPwqOsvbW1zcHLv827p7bLtcTP1Mq+0dOz2aGjPC9wPiAgICAgICAgICAgICAgICAgILHgwuvRucv1uf2zzM3qs8m686Osz8LSu7K9vs3Sqr340NCjrMrTxrVSVFC08rD8uaTX98HLoaPUrcq8tcQgSC4yNjQgytPGtbHgwuvK/b7do6yyu8Tc1rG909PD09rN+MLntKvK5KOsyN3S19Tss8m2qrD8vLC0q8rktO3O86Os0OjSqrbUxuS9+NDQt+LXsKGj0vK0y9Tav827p7bL06bTw7PM0PLW0LzTyOvBy1JUULTysPzX07mmxNyho8rTxrXK/b7dtcTV+7j2tPKw/Lfi17C5/bPMyOfPws28IMv5yr6ho8HtzeKjrNTayrXKsdDU0qrH873PuN+1xNOm08OzobrPo6xSVFAgysfKudPDVURQIL340NDK/b7dtKvK5KGjz8LD5r7NvPK1pb3pydzSu8/CUlRQK1VEULD8tcS94bm5o7o8cD4gICAgICAgICAgICAgICAgPGltZyBzcmM9"http://www.it165.net/uploadfile/files/219.jpg" alt="" />
RTP 载荷常用的打包方式有三种:单NAL 单元方式,非交错方式以及交错方式。各种方式有其允许的NAL 单元类型,常用的类型有单个NAL 单元包(NAL unit),聚合包(STAP-A,STAP-B,MTAP),分片单元(FU-A,FU-B)等。其中,NAL unit 包中必须包含一个完整的编码后的NAL 单元,聚合包中包含一个或多个NAL 单元,而分片单元Fus 允许将一个NAL单元分片到几个RTP 包中。根据TI 提供的H.264 压缩算法及其压缩后的NAL 单元数据特点,本文采用NAL unit 和FU-A 两种包类型。其对应的RTP 载荷格式主要是头部不同,描述如下。
NAL unit头部为一个字节,三个标志的含义如下。F:1 bit,0 表示NAL 单元类型的八位组和载荷不允许包含比特错误或其它语法错误,1 则相反。H.264规范要求该位为0;NRI:2 bits,与编码后的网络抽象层NAL 单元中的NAL 单元类型字节里NRI 值保持一致。Type:5 bits,H.264 规范定义其取值范围为1~23。在该类型包设计时取值同上,即与NAL 单元类型字节里nal_unit_type 相同。程序设计时该字节与NAL 单元第一字节设置为相同即可,对于编码后的NAL 单元,第一字节即是NAL 单元类型字节。FU-A头部包含两个字节,第一字节为FU indicator,第二字节为FU header。FU indicator,该字节与NAL unit 头部结构相同。标志F 和NRI 设置方法同上,对于Type 标志,规范中该类型值设置为28。FU header,各标志含义如下。S:1 bit,开始标志位。对于NAL 单元第一个分片,设置为1,其它为0。E:1 bit,结束标志位。对于最后一个分片,设置为1,其它为0R:1 bit,保留位,设置为0,接收者必须忽略该位。Type:5 bits,NAL 单元荷载类型,与编码后的网络抽象层NAL 单元中的NAL 单元类型字节nal_unit_type 值保持一致。对于原始压缩数据,不仅要进行RTP 载荷打包,还需要增加RTP 头来组成完整的RTP 包。我是用的是JRTPLIB 库实现RTP 的自动打包以及传输功能。RTP包头所需的一些参数如:Market,帧间延时时间,时间戳由函数SendPacket 参数传入。写到这里服务器端功能模块基本介绍完了。再说一下程序设计关键点,如下:(1)由于MFC驱动中的视频源数据的颜色空间必须为NV12,因此在通过V4L2框架初始化/video0 输出视频格式时,注意要将格式设置为NV12,从而才能正确解码。(2) 通过MFC硬编码后的一帧视频包含若干个NAL 单元,每个NAL 单元都由一个起始码开头,对于S5PV210的MFC硬件编码H.264 压缩算法起始码由00 00 00 01 四个字节组成。(3) 由于UDP协议会对大于1500 字节的数据包进行自动拆包,从而导致丢包概率会大大增加。因此需要设置RTP 荷载包的最大长度为1400。在封装荷载头,RTP头,UDP头和IP头后长度依然会小于1500字节,降低丢包概率。(4) 参数M,PT,timestamp 设置。M,对于NAL_unit 包类型即单个NAL单元长度值小于1400字节,值为1。当单个NAL单元长度大于1400时,需要进行分片处理。FU-A 类型除该NAL 单元的最后一个分片设置为1 外,其它为0;载荷类型PT 根据标准设置为96;时间戳在SendPacket 函数中传入的是其增量timestamp_inc,对于NAL unit,由于视频采用的是PAL 制式,故值设为9000/25。对于同一NAL 单元的所有FU-A 分片包,timestamp 值应相同。因此,除第一个包设置值以外,其它为0。服务器端程序流程图如下:
延伸阅读:
目的:通过挂载的方式,可以类似访问本地磁盘的方式一...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......求怎么做个摄像头的流媒体服务器。。。 - 查看主题 & Ubuntu中文论坛
&[ 8 篇帖子 ]&
&文章标题 : 求怎么做个摄像头的流媒体服务器。。。发表于 :
21:22帖子: 5
送出感谢: 0 次
接收感谢: 0 次
毕业设计选了个视频监控,然后悲剧了。我想要在计算机上做个能把摄像头采集到的数据传到安卓手机的流媒体服务器,导师规定编码器用ffmpeg,是不是服务器可以不用ffmpeg的?有什么推荐的吗?最好在推荐点资源,vlc, ffmpeg server我也去看过都是大把大把的英文,亚历山大啊第一次来贵论坛就伸手,真是不好意思啊,请了解的前辈们能够指点1 ,2
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
1:21帖子: 512
送出感谢: 0 次
接收感谢: 0 次
图像采集-&h264编码-&rtsp流媒体包-&rtsp解包-&h264解码-&图像绘制这个水很深,换个简单点的吧
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
17:46帖子: 379
_________________
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
21:22帖子: 5
送出感谢: 0 次
接收感谢: 0 次
liujingjing5 写道:图像采集-&h264编码-&rtsp流媒体包-&rtsp解包-&h264解码-&图像绘制这个水很深,换个简单点的吧果然好深,3个礼拜了,ffmpeg还没编译出来,我都不确定对不对。不过没有回头路了,我就用视频采集-&ffmpeg-&ffmpeg server-&rtsp协议发布-&客户端的rtsp解析-&ffmpeg解码-&videoviewi...这个过程应该没错吧
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
1:21帖子: 512
送出感谢: 0 次
接收感谢: 0 次
vjnjc 写道:liujingjing5 写道:图像采集-&h264编码-&rtsp流媒体包-&rtsp解包-&h264解码-&图像绘制这个水很深,换个简单点的吧果然好深,3个礼拜了,ffmpeg还没编译出来,我都不确定对不对。不过没有回头路了,我就用视频采集-&ffmpeg-&ffmpeg server-&rtsp协议发布-&客户端的rtsp解析-&ffmpeg解码-&videoviewi...这个过程应该没错吧帅哥,你搞定了么,我也要用到这个了
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
21:22帖子: 5
送出感谢: 0 次
接收感谢: 0 次
liujingjing5 写道:vjnjc 写道:liujingjing5 写道:图像采集-&h264编码-&rtsp流媒体包-&rtsp解包-&h264解码-&图像绘制这个水很深,换个简单点的吧果然好深,3个礼拜了,ffmpeg还没编译出来,我都不确定对不对。不过没有回头路了,我就用视频采集-&ffmpeg-&ffmpeg server-&rtsp协议发布-&客户端的rtsp解析-&ffmpeg解码-&videoviewi...这个过程应该没错吧帅哥,你搞定了么,我也要用到这个了 按照上面的网址应该能把服务器端搞定,但是我用ubuntu11.10的apt装的ffmpeg好像有问题,你还是下个老版本的把,我的邮箱 要是你有进展的话希望告知
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
14:34帖子: 231
系统: ArchLinux
直接vlc的串流加转码,服务器就OK了啊,而且图形界面,无压力的嘛....
_________________------------------------------------------------------------------------------
&文章标题 : Re: 求怎么做个摄像头的流媒体服务器。。。发表于 :
21:22帖子: 5
送出感谢: 0 次
接收感谢: 0 次
雨坤毅 写道:直接vlc的串流加转码,服务器就OK了啊,而且图形界面,无压力的嘛....
关键就是出在图形界面上,我们老师不准我们点击点击点击就完成了,所以要在命令行下面进行,不然你让我编个服务器我哪编的出来呀。。。
显示帖子 : 全部帖子1天7天2周1个月3个月6个月1年&排序 作者发表时间文章标题 升序降序&
&[ 8 篇帖子 ]&
正在浏览此版面的用户:没有注册用户 和 0 位游客
您 不能 在这个版面发表主题您 不能 在这个版面回复主题您 不能 在这个版面编辑帖子您 不能 在这个版面删除帖子您 不能 在这个版面提交附件
选择一个版面
------------------
公告/注意事项
& &新闻和通知
& &校园社团支持
& && &华东校区
& && &华南校区
& && &华北校区
& && &华中校区
& && &东北校区
& && &西北校区
& && &港澳台校区
& && &国外校区
& &软件推荐
& &非常任务
系统安装区
& &教学和常见问答
& && &课堂教学和培训
& &初学者园地 - 16.04
& &系统安装和升级
& && &新立得和软件源
& && &Wubi安装讨论
& &启动和引导
& &网卡问题以及网络和拨号
& && &校园网拨号
& &笔记本、UMPC支持
& &手机和平板
& && &Ubuntu移动应用开发
& &常用硬件支持
& &系统架构支持
配置美化区
& &字体美化和中文支持
& && &个人配置文件存放点
& &桌面特效
& &窗口管理器
& &屏幕抓图
& &办公、图像、机械电子设计等
& && &Vim和Emacs
& &因特网相关软件
& &影音多媒体
& &Wine及其分支
& &游戏和游戏模拟器
& &虚拟机和虚拟化
& &其它类软件
& &开源模板库
服务器管理
& &服务器基础应用
& &数据库管理
& &服务器维护和硬件相关
& &Ubuntu VPS
参与Ubuntu开发
& &软件和文档翻译
& &编译或打包
& &Ubuntu错误报告
程序设计区
& &Shell脚本
& &GTK+和QT
& &软件/网站开发
& && &Python/Php/Perl
& && &C/C++/Java
& &内核及嵌入式开发
& &开源小工具
& &Ubuntu 16.10
& &Ubuntu 14.04 LTS
& &Ubuntu 12.04 LTS
& &Ubuntu 10.04 LTS
& &老旧版本支持
& && &Ubuntu 15.10
& && &Ubuntu 15.04
& && &Ubuntu 14.10
衍生发行版
& &Ubuntu GNOME
& &Kubuntu
& &Xubuntu & Lubuntu
& &Ubuntu中文衍生版
& && &UbuntuKylin
& &Ubuntu国外衍生版
& && &Mint
& &Ubuntu衍生版制作
& &其它类Unix OS发行版
& && &Arch发行版
& && &Debian发行版
& && &OpenSUSE发行版
& && &Deepin
& &深度PK版
& &Ubuntu故事和感慨
& &Full Circle开源杂志
分享交流区
& &同城交流
& &线下活动专版
& &Ubuntu宣传推广
& &论坛管理
& && && &Ubuntu中文网上商店由于我也是刚开始接触这个东东,原理什么的不是很清楚,这里我就不说了,免得误人子弟,嘿嘿!第一步,下载FlashMediaServer3.5,网上有很多资源,这里就不提供了,大家google一下就可以了,这里给一个序列号:19-02,我用地就是这一个。安装完后,打开FlashMediaServer3.5服务,一个是Start Adobe Flash Media Server 3.5.2,另一个是Start Flash Media Administration Server 3.5.2。第二步:在FlashMediaServer3.5安装目录下的applications文件夹下新建一个测试文件夹“tests”。这个文件夹后面会用到。第三步:下载Flex Builder 3,地址我也不提供了,网上google一下,有很多资源的。安装Flex Builder3第四步:编写录音,录像程序MyTest。这里的代码是从网上扒的。原文地址:&其中修改了一下我服务器的地址,具体代码如下:View Code&?xml version="1.0" encoding="utf-8"?&&mx:Application xmlns:mx="/2006/mxml" layout="absolute" creationComplete="playinit()" width="366" height="350" &&mx:Script&&![CDATA[import mx.events.SliderEimport mx.events.VideoEimport mx.collections.ArrayCimport mx.rpc.events.ResultEimport mx.core.UICimport flash.events.StatusEimport flash.events.SecurityErrorEimport flash.media.Cimport flash.media.Mimport flash.net.NetC//由于fms使用的是amf0而flex3中的as3默认使用的是amf3.所以要让flex使用AFM0NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;//视频服务端地址private var _videoServerURL:String = "rtmp://192.168.2.105/tests";private var _camera:C //定义一个摄像头private var _mic:M //定义一个麦克风private var _localVideo:V //定义一个本地视频private var _netConnection:NetCprivate var _outStream:NetS //定义一个输出流private var _inStream:NetS //定义一个输入流private var isplaying:Boolean=false; //定义是否正在播放标记private var isrecing:Boolean = false; //定义是否正在录制标记private var ispauseing:Boolean = false; //定义是否正在暂停标记private var _duration:N //定义视频持续时间private var playPosition:N //定义播放进度位置private var soundPosition:N //定义声音大小控制条的位置private function playinit():void{t_hs_control.enabled=false;t_btn_play.enabled = false;t_btn_stop.enabled = false;t_btn_rec.enabled = false;t_btn_save.enabled = false;t_lbl_rec.visible = false;initCameraAndMic(); //初始化摄像头}//初始化摄像头//判断是否存在摄像头和访问权限private function initCameraAndMic():void{_camera = Camera.getCamera();if(_camera != null){_camera.addEventListener(StatusEvent.STATUS,__onStatusHandler);_camera.setMode(320,420,30);//t_flv_video.attachCamera(_camera);_localVideo = new Video();_localVideo.width = 320;_localVideo.height = 240;_localVideo.attachCamera(_camera);t_flv_video.addChild(_localVideo);}_mic = Microphone.getMicrophone();if(_mic != null){//未添加侦听麦克连接状态//设置本自本地的麦克风的音频传送到本地系统扬声器/*_mic.setUseEchoSuppression(true);_mic.setLoopBack(true);*/_mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据_mic.gain = 80; //设置麦克风声音大小}}//开始录制视频//检测网络连接状态private function beginOrShowRecVideo():void{_netConnection = new NetConnection();_netConnection.addEventListener(NetStatusEvent.NET_STATUS,__onNetStatusHandler);_netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR,__onSecurityErrorHandler);_netConnection.connect(_videoServerURL);}//录制视频,向服务器传送视频及音频流private function beginRecConnectStream():void{if(_localVideo != null){_localVideo.clear();t_flv_video.removeChild(_localVideo);_localVideo = new Video();_localVideo.width = 320;_localVideo.height = 240;_localVideo.attachCamera(_camera);t_flv_video.addChild(_localVideo);}_outStream = new NetStream(_netConnection);_outStream.attachCamera(_camera);_outStream.attachAudio(_mic);_outStream.publish("testVideo","record");}//播放视频private function showRecConnectStream():void{_inStream = new NetStream(_netConnection);_inStream.addEventListener(NetStatusEvent.NET_STATUS,__onNetStatusHandler);_inStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR,__onStreamErrorHandler);//定义onMetaData,获取视频相关数据var customClient:Object = new Object();customClient.onMetaData = function(metadata:Object):void{_duration = metadata. //获取视频持续时间t_hs_control.maximum = _ //设置播放进度条最大值}_inStream.client = customC//删除原_localVideo,便于在录制和播放视频之间切换_localVideo.clear();t_flv_video.removeChild(_localVideo);_localVideo = new Video();_localVideo.width = 320;_localVideo.height = 240;_localVideo.attachNetStream(_inStream);_inStream.play("testVideo");t_flv_video.addChild(_localVideo);}//播放按钮点击后事件:播放视频,同时分析是否播放来调整BUTTON上的标签,显示为播放或者暂停;//并监听播放器private function flvplay(event:Event):void{t_hs_control.enabled=true;t_btn_stop.enabled = true;t_btn_rec.enabled = false;if(!isplaying){isplaying = true;beginOrShowRecVideo();}else{_inStream.togglePause(); //自动在停止和播放之间切换}if(isplaying){if(ispauseing){t_btn_play.label="播放"}else {t_btn_play.label="暂停"}ispauseing = !}addEventListener(Event.ENTER_FRAME,__onEnterFrame);}//停止按钮和视频播放完毕//重设一些值变量、按钮enabled值等private function resetSomeParam():void{_inStream.close();t_btn_play.label = "播放";t_lbl_playtime.text = "0:00 / "+ formatTimes(_duration);t_hs_control.value = 0;isplaying = false;ispauseing = false;t_hs_control.enabled=false;t_btn_rec.enabled = true;t_btn_stop.enabled = false;}//停止播放按钮点击事件:停止视频,同时调整相关BUTTON上的标签private function flvStop(event:Event):void{resetSomeParam();removeEventListener(Event.ENTER_FRAME,__onEnterFrame);}//拉动进度条private function thumbPress(event:SliderEvent):void{_inStream.togglePause();removeEventListener(Event.ENTER_FRAME,__onEnterFrame);}//进度条改变后,得到的值赋予PLAYPOSITION;private function thumbChanges(event:SliderEvent):void{playPosition = t_hs_control.}//放开进度条,再把PLAYPOSITION的值发给播放器;private function thumbRelease(event:SliderEvent):void{_inStream.seek(playPosition);_inStream.togglePause();addEventListener(Event.ENTER_FRAME,__onEnterFrame);}//声音音量控制private function sound_thumbChanges(event:SliderEvent):void{soundPosition = hs_sound.}private function sound_thumbRelease(event:SliderEvent):void{t_flv_video.volume = soundP}//格式化时间private function formatTimes(value:int):String{var result:String = (value % 60).toString();if (result.length == 1){result = Math.floor(value / 60).toString() + ":0" +} else {result = Math.floor(value / 60).toString() + ":" +}return}//录制按钮点击后事件:录制视频,同时分析是否播放来调整BUTTON上的标签,显示为开始录制或者停止录制;//并监听播放器private function recVideo(event:MouseEvent):void{if(!isrecing) //开始录制{isrecing = true;t_btn_rec.label = "停止录制";t_btn_play.enabled = false;t_btn_save.enabled = false;t_lbl_rec.visible = true;beginOrShowRecVideo();}else //停止录制{isrecing = false;t_btn_rec.label = "开始录制";t_btn_play.enabled = true;t_btn_save.enabled = true;t_lbl_rec.visible = false;_outStream.close();}}//检测摄像头权限事件private function __onStatusHandler(event:StatusEvent):void{if(!_camera.muted){t_btn_rec.enabled = true;}else{trace("错误:无法链接到活动摄像头!")}_camera.removeEventListener(StatusEvent.STATUS,__onStatusHandler);}//网络链接事件//如果网络连接成功,开始录制或观看视频private function __onNetStatusHandler(event:NetStatusEvent):void{switch (event.info.code){case "NetConnection.Connect.Success":if(isrecing){beginRecConnectStream();}else{showRecConnectStream();}break;case "NetConnection.Connect.Failed":trace("连接失败!");break;case "NetStream.Play.StreamNotFound":trace("Stream not found: " + event);break;}}private function __onSecurityErrorHandler(event:SecurityErrorEvent):void{trace("securityErrorHandler:" + event);}private function __onStreamErrorHandler(event:AsyncErrorEvent):void{trace(event.error.message);}//播放视频实时事件//实时更改播放进度条值和播放时间值,当视频播放完成时删除实时侦听事件并重新设置一些初始值private function __onEnterFrame(event:Event):void{if(_duration & 0 && _inStream.time & 0){t_hs_control.value =_inStream.t_lbl_playtime.text = formatTimes(_inStream.time) + " / "+ formatTimes(_duration);}if(_inStream.time == _duration){removeEventListener(Event.ENTER_FRAME,__onEnterFrame);resetSomeParam();}}]]&&/mx:Script&&!--通过HTTPSERVICE来分析XML,然后得出RESULT,结果的反馈在SCRIPT里--&&!--此为读取XML扩展内容&mx:HTTPService id="videoserver" url="assets/videos.xml" result="readXml(event)" /&--&&!--主要的视频播放窗口 设置ID为FLVVIDEO,这个很重要,其他坐标可以随自己喜欢 --&&mx:Panel x="12" y="10" width="342" height="282" layout="absolute"&&mx:VideoDisplay
id="t_flv_video" x="1" y="1" width="320" height="240"/&&mx:Label x="243.5" y="6" text="正在录制中…" id="t_lbl_rec" color="#666666" fontSize="12"/&&/mx:Panel&&!--播放器的播放进度条,用FLEX自带的HSLIDER来表现播放进度,同时可以拖动影片--&&mx:HSlider id="t_hs_control" x="12" y="296" minimum="0"thumbPress="thumbPress(event)"thumbRelease="thumbRelease(event)"change="thumbChanges(event)" /&&!--播放器声音控制--&&mx:HSlider id="hs_sound" x="260" y="295" width="80"minimum="0" maximum="1"thumbRelease="sound_thumbRelease(event)"change="sound_thumbChanges(event)"value="{t_flv_video.volume}" /&&!--播放按钮,根据是否在播放,按钮显示为:播放 或者 暂停--&&mx:Button id="t_btn_play" x="22" y="320" click="flvplay(event)" label="播放" fontSize="12" /&&!--播放按钮,停止播放影片--&&mx:Button id="t_btn_stop" label="停止" x="85" y="320"click="flvStop(event)" fontSize="12" enabled="true"/&&!--时间显示--&&mx:Label x="170" y="300" id="t_lbl_playtime"text="0:00 / 0:00" color="#ffffff"/&&!--录制按钮,根据是否在录制,按钮显示为:开始录制 或者 停止录制--&&mx:Button x="210" y="320" label="开始录制" click="recVideo(event)" fontSize="12" id="t_btn_rec"/&&!--保存视频按钮--&&mx:Button x="299" y="320" label="保存" fontSize="12" id="t_btn_save" enabled="true"/&&/mx:Application&第五步:编写同步播放的程序VideoPlayer,这个也是从网上扒的,原文地址:&我修改了服务器地址,由于源码是flex4的,所以我修改成了Flex3。我的代码如下:videoConfig.xmlView Code&?xml version="1.0"?&&videoConfig&
&rtmpUrl&rtmp://192.168.2.105/tests/&/rtmpUrl&
&filmName&testVideo.flv&/filmName&
&/item&&/videoConfig&VideoEvent.asView Codepackage{
import flash.events.EventD
public class VideoEvent extends EventDispatcher
静态常量,定义事件类型
public static const VidoPlay:String="VideoPlay";
private static var _instance:VideoE
public static function getInstance():VideoEvent
if(_instance==null)
_instance=new VideoEvent();
}}VideoPlayer.mxmlView Code&?xml version="1.0" encoding="utf-8"?&&mx:Application xmlns:mx="/2006/mxml" layout="absolute" creationComplete="init()" width="366" height="350"&
&!-- Place non-visual elements (e.g., services, value objects) here --&
&!--&mx:HTTPService id="myService" url="videoConfig.xml" result="resultHandler(event)"/&--&
&!-- Place non-visual elements (e.g., services, value objects) here --&
&mx:HTTPService id="myService" url="videoConfig.xml" result="resultHandler(event)"/&
&mx:Script&
import mx.rpc.events.ResultE
import mx.controls.A
//定义视频播放事件监听对象
public var instance:VideoEvent=VideoEvent.getInstance();
private var filmSource:String="";//IronMan.flv
private function init():void
//发送读取配置的请求
myService.send();
//定义视频播放事件监听
instance.addEventListener("VideoPlay",playVideoHandler);
//视频监听的处理
private function playVideoHandler(event:Event):void
var myVideo:SharedO
//将播放头置于视频开始处
myVideo=SharedObject.getLocal("videoCookie");
var vName:String=myVideo.data.vN
//播放选中的视频
film.source=filmSource+vN
private function changeSource():void
var myVideo:SharedO
//将播放头置于视频开始处
myVideo=SharedObject.getLocal("videoCookie");
//将视频的文件名称,存放到共享文件里
myVideo.data.vName="DarkKnight.flv";
//一定要先存放VCODE到共享对象里,再分发事件
instance.dispatchEvent(new Event("VideoPlay"));
//读取配置文件
private function resultHandler(event:ResultEvent):void
//获取流媒体服务器 地址
filmSource=event.result.videoConfig.item.rtmpU
//获取流媒体文件名
var filmName:String=event.result.videoConfig.item.filmN
//获取流媒体完整路径
film.source=filmSource+filmN
&/mx:Script&
&mx:VideoDisplay width="396" height="294" id="film"&
&/mx:VideoDisplay&&mx:Button
label="更换播放源" buttonDown="changeSource()" x="8" y="301"/&&/mx:Application&第六步:运行,效果图如下:左图是录像,右图是播放。(注意:本文中的程序在现实运行中,播放的画面比实时录像的画面要延时几秒钟,谁有更好的解决方案,请不吝赐教!谢谢)
阅读(...) 评论()
友情链接:

我要回帖

更多关于 rtmp流媒体服务器 的文章

 

随机推荐