有谁做了海思上的RTSP直播实现

有谁做了海思上的RTSP直播实现,第1张

最近在另外一个平台上,参照WIS-STREAMER做了个H.264直播,但是延时好大,而且还有马赛克现象后期是准备在海思平台上实现.

目前,网络媒体自身还没准确抽象概括出网络直播的界定,为方便起见,不妨参照传播学及电视现场直播的概念给网络直播下个简单的定义:在现场随着事件的发生、发展进程同步制作和发布信息,具有双向流通过程的信息网络发布方式。其形式也可分为现场直播、演播室访谈式直播、文字图片直播、视音频直播或由电视(第三方)提供信源的直播;而且具备海量存储,查寻便捷的功能。

与电影单一的过去时空相比,电视直播可显现的时空既有现在时又有过去时,而网络直播除具备电视的两大时空之外还具有压缩时空的功能。如同步的文字直播、图片直播、赛事直播、手机直播和比分直播等等各种直播频道和样式。随着社会的发展效率已经让大家知道直播的铅羡山好处,减少成本,加快信息的传播。

随时互联网络技术的发展,直播的概念有了新的拓展和发展,现在更多的人关注网络直播,特别是网络视频直播更受关注。通过网络信号,在线收看派伍球赛、体育赛事、重大活动和新闻槐中等,这样,让大众有了广阔且自由的选择空间。当然,直播技术随着移动互联技术的发展,还会有新的进步。到那时,可能我们能够真正的随时随地的体验直播的快乐和便捷。

live555库本身实现了做rtsp服务器,客户端可以通过rtsp客户端访问服务器上的文件并播放,支持的文件格式如下:

本次任务实现了把live555移植到嵌入式海思芯片hi3516上做rtsp服务器,除了支持客户端播放服务器上上面格式文件外,另添加了实时播放hi3516摄像头图像与音频的功能。

live555源码目录如下:

四个基本的库分别是:BasicUsageEnvironment, groupsock, liveMedia和UsageEnvironment。

编译后即生成这4个库文件:

这里我只简谨渗单说下liveMedia库的功能,其他三个库是live555运行的基础库,太(mei)简(yan)单(jiu),就不说了。

liveMedia库包含了音视频相关的所有功能,包含音视频文件的解析,RTP传输封装等,我们可以看到这个目录下有对h264、AAC等文件解析的支持:

交叉编译过程:略

这里我主要是修改mediaServer文件夹下的示例程序,添加实时预览摄像头图像与mic声音功能。

hi3516芯片,视频编码格式为h264,音频编码格式为AAC。

1.添加音频AAC支持

添加类 ADTSAudioLiveSource ,继承自FramedSource

在该类的哗枣doGetNextFrame函数里实现获取hi3516音频数据做为rtsp服务器音频源。

注意点:

1.1 adts默认是带7字节或者9字节的头,传给rtsp的时候是要去掉头的,实际上RTSP通过rtp传输AAC帧的时候是不带adts头的,而是带4个字节的mpeg4-generic头。

1.2 从FramedSource继承而来的变量

每次doGetNextFrame帧时,从FIFO里取一个完整的AAC帧,把帧拷贝到fTo buf里面,然后比较帧大小与fMaxSize来赋值几个关键的变量:

注意,不管帧长是否大于fMaxSize,每乱晌拆次都需要把完整的帧拷贝到fTo指针,live555内部会根据fNumTruncatedBytes等变量自行处理分包。

1.3 doGetNextFrame函数最后不管有没有取到帧,都需要执行FramedSource::afterGetting

1.4 采样率,通道数,configstr等的计算

这几个变量在mediaSubbsession建立RTPsink时要用到,它直接影响了SDP里对于AAC音频描述字段的产生

添加类 AACAudioLiveServerMediaSubsession ,继承自ADTSAudioFileServerMediaSubsession

createNewStreamSource函数创建上面的ADTSAudioLiveSource做为音频输入源,参数estBitrate为预估的码率,海思AAC编码码率设置为24kbps,所以estBitrate设置为24.

createNewRTPSink有必要继承,因为需要根据音频源的采样率、通道数等创建RTPSink.

2.添加h264支持

添加 H264FramedLiveSource ,继承自FramedSource

unsigned maxFrameSize()函数必须继承,里面设置帧最大可能的大小,我设置为100000,如果不继承就是默认的,会出现画面马赛克

doGetNextFrame函数里面和AAC取帧的处理差不多,我加多了一个步骤,就是第一次取帧的时候会调用接口去产生一个关键帧,并且等待这个关键帧到来才处理,这样连接后出图会比较快。

添加类 H264VideoLiveServerMediaSubsession ,继承自H264VideoFileServerMediaSubsession

这个类就是实现createNewStreamSource时创建H264FramedLiveSource

3.修改DynamicRTSPServer

修改类DynamicRTSPServer,在lookupServerMediaSession函数里动点手脚,默认在这个函数里面会根据文件名去寻找服务器下相应的文件做为直播源,我这里比较如果是我特定的live源名字则直接返回,相应的live源创建rtsp服务器的时候就添加好

4.初始化rtsp server

初始化rtsp服务器,添加一个ServerMediaSession,该mediaSession添加一个AACAudioLiveServerMediaSubsession和一个H264VideoLiveServerMediaSubsession,然后把该mediaSession添加给rtsp服务器。

客户端访问 rtsp://x.x.x.x/ch0.live 时就可以看到实时的摄像头图像与声音啦!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12419177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存