吾知网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8743|回复: 1
打印 上一主题 下一主题

[AS3]as3做摄像头直播H264VideoStream的示例

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-19 17:11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
import flash.media.H264VideoStreamSettings;
import flash.media.VideoStreamSettings;
import flash.media.H264Level;
import flash.media.VideoCodec;
import flash.media.H264Profile;
var myNS:NetStream = new NetStream(nc);  
var h264Settings:H264VideoStreamSettings = new H264VideoStreamSettings();
h264Settings.setProfileLevel(H264Profile.BASELINE, H264Level.LEVEL_5_1);
h264Settings.setMode(320,240,15);
h264Settings.setQuality(0,100);
myNS.videoStreamSettings = h264Settings;
myNS.publish("livestream","live");
---------------------以上代码没有效果只能开始摄像头工作,再换下面一段试试
video.attachVideo(Camera.get());
video.attachAudio(Microphone.get());  
//CuPLayer.com提示:可以理解为在nc连接上绑一个流  
var nsOut:NetStream = new NetStream(nc);  
//CuPLayer.com提示:在流上加麦克风和视频头  
nsOut.attachVideo(Camera.get());
nsOut.attachAudio(Microphone.get());  
nsOut.publish("livestream", "live");
----------------这段代码在as2中能通过,但是屏幕不显示录像的图片,
晕,现在是在as3,肯定也通不过的,再换一段
import flash.display.Sprite;
    import flash.media.Camera;
    import flash.media.Video;
    var camera:Camera;
    var video:Video;
    camera = Camera.getCamera();
    video = new Video(320,240);//CuPLayer.com提示:构造函数中的参数是宽度和高度,默认是320,240。   
    video.attachCamera(camera);
    addChild(video);

现有的安防监控设备视频传输都是用的各家私有协议,鲜有用标准协议rtsp的。如果能用rtsp来传输,那很多标准的rtsp客户端都能连上观看,真正做到互联互通。Live555是目前实现rtsp协议最短小精悍的开源代码,能很方便的移植到各种嵌入式系统中,而且该开源项目更新速度很快,基本每个月都有更新版本。Live555目前已经实现了基于udp和tcp的传输,支持mpg、mkv、h264、mpeg4、amr等文件的点播。有服务器端和客户端两种实现。

首先需要将live555移植到嵌入式linux上编译,这一步比较简单,只要执行下面的步骤即可。

Ø 修改config.armlinux,将编译器改为对应的交叉编译器名,如arm-uclibc-linux-

Ø 执行genMake armlinux,生成相应的makefile文件

Ø 执行 make,即会生成live555库。

Live555采用的是单线程架构,将所有事件句柄(包括socket,fd)都加入事件队列中,然后在BasicTaskScheduler::SingleStep中调用select轮询每个事件句柄,如果有事件发生就进入相应的事件处理。

Live555中自带了一个server的例子是实现的文件点播,实现直播和点播有些区别,这里参考了wis-streamer的代码。我原来在arm板上已实现了每采集压缩一个数据包,就存入队列中。为了与live555的select事件相对应,加入了管道操作,在将数据包存入队列的同时,同时往管道写1个数。再将管道句柄加入live555的事件队列中,在相应的事件处理函数中从管道读1个数,同时从队列中读取一个数据包。对应到代码中是修改WISInput.cpp中的WISVideoOpenFileSource::readFromFile,将原来从v4l读取视频数据改为从队列读取。另外wisinput原来读取的视频为未压缩的原始数据,这里已经在arm板上用硬件压缩完成了,不需要软压缩,因此不再需要创建相应的压缩filter。再者arm板上往队列中写入数据包前已经做了分包处理,不再需要在live555中进行rtp分包,因此将MultiFramedRTPSink.cpp进行相应的修改,主要修改了MultiFramedRTPSink::packFrame()、MultiFramedRTPSink::afterGettingFrame1函数。同时修改了H264VideoRTPSink::continuePlaying(),不需要创建H264FUAFragmenter进行h264数据分包。

上面主要描述了针对h264视频的处理,对音频的处理也是同样的思路。经过对live555的移植和改造,实现了在arm板上采集压缩h264视频,采用rtsp协议直播。客户端在pc机上可以用vlc、quicktime等软件连接,在手机上可以用coreplayer连接。另外还可以用rtsp协议发到flash media server上,通过flash media server的转发,用户在网页上可以用flash看到实时视频。这就是采用标准协议的好处,可以与多种现有的客户端和服务器实现互联互通。


沙发
 楼主| 发表于 2016-8-19 17:16:45 | 只看该作者
[live555]rtsp直播基于live555的实现

一直很想做流媒体的直播,最近花时间看了有关live555的有关代码,这里隆重的推荐两篇:

   http://blog.csdn.net/nkmnkm (道长的文章,分析的很不错)

   http://blog.csdn.net/gavinr (这里面的文章容易让人理清思路)


其实刚入门的时候,看这两篇帖子也比较吃力,我们先看看live555编译之后文件夹下的内容,帮助理解。

1)、在mediaSever目录下面有个live555MediaServer.exe,这是live555自带生成的服务器端,我们可以做一个简单的测试:

    将一个264文件比如test.264拷贝到exe文件所在的目录下(就是mediaSever目录下);

    双击打开这个exe服务器端;

    在另外一台机器上打开vlc,使用“媒体-->打开网络串流”,输入服务器的dos窗口中的URL,比如:

2)、还有一个目录就是testProgs,这里面的代码都是实例代 码,对于改写你自己需要的程序一定会有很大的借鉴作用,编译live555之后会产生testOnDemandRTSPServer.exe,这也是一个 服务器端,还有很多别的可以自己慢慢研究,后面设计的基于live555的直播的服务端就是借鉴于testOnDemandRTSPServer.cpp 来改写的。

    基于live555的直播也是在网上找了很多资料,看了很多前辈的博文,这里使用directshow采集摄像头视频,然后使用x264进行编码,服务器端参考testOnDemandRTSPServer.cpp进行改写,实现了直播,上图:

后期工作:

    这里使用的是directshow采集的视频,没有加音频采集,后期可以继续加入音频采集部分,然后进行编码,在testOnDemandRTSPServer.cpp中通过sms->addSubsession加入音频流;

    directshow不可以跨平台,所以可以考虑所以opencv进行采集视频;

    网上有基于live555开发的RTSP客户端,有机会可以研究一下



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|吾知网 ( 粤ICP备13013563号-1 )

GMT+8, 2024-12-22 14:45 , Processed in 1.093750 second(s), 7 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表