live555对于实时音视频的支持

live555本身,可以支持将文件作为源,提供RTSP播放服务器功能。
为了使live555能够支持实时流的播放,需要进行改造。
有两种方式:
1,一个比较简单,可以使用管道文件的方式。缺点是当码流较大时,
   会明显的卡顿、马赛克。(测试超过80K时会卡得非常厉害)
2,再一个,需要自己重载source,submission类。在其中实现数据的对接。
下面分别介绍一下这两种方式


一、管道方式:
1,打开live/testProgs/testOnDemandRTSPServer.cpp,修改reuseFirstSource的值为True,并编译之
2,参考该程序的参数,即可实现文件的播放。而我们将其指向管道文件
2,mkfifo live/testProgs/test.264
3,写自己的程序,将H264编码的数据write到test.264管道中。就普通的open,write即可
注意,在写入端,注意拦截SIGPIPE信号。signal(SIGPIPE, _sighandle). 原因是,当rtsp端关闭流时,
 会导致SIGPIPE发生,并退出程序。但其实我们可能不想退出。


二、重写source
1,编写类:LiveServerMediaSubsession: public OnDemandServerMediaSubsession
2,对于H264编码而言,我们可以把H264VideoFileServerMediaSubsession原样抄过来,在其基础上修改
3,去掉无用的参数,重写createNewStreamSource。里面换成一个新类:FrameLiveSource做输入Source
4,编写类:FramedLiveSource: public FramedSource
5,有几个函数需要完成:
1)maxFrameSize,最大帧的大小。
2)doGetNextFrame(); 关键函数,负责获取数据。核心代码如下:
memcpy(fTo, buffer, len);
gettimeofday(&fPresentationTime, NULL);
fFrameSize = len;
nextTask() = envir().taskScheduler().scheduleDelayedTask(0,
(TaskFunc*)FramedSource::afterGetting, this);
3)isH264VideoStreamFramer。当数据准备好时,该函数返回True
6,后面就简单了,只要把doGetNextFrame和正常的实时视频数据联系起来,一切就解决了。




三、live555的下载、编译方式
1,网站上下载live555,网址:http://www.live555.com/liveMedia/
2,./genMakefile linux
3,make
其中,./genMakefile linux,是对应config.linux来的。
我们可以参考config.armlinux修改成自己所需的版本


五、音频SERVER的实现 使用G726-40
共需要两个类:
1,class FramedAudioSource : public FramedSource
1)只要实现一个:doGetNextFrame即可,关键代码如下:
int len = Get_Data(fTo, fMaxSize);
if (len <= 0)
{//获取不到数据时,一定要起个检查定时器。否则程序就停止了
//nextTask() = envir().taskScheduler().scheduleDelayedTask(...
}
fFrameSize = len;
FramedSource::afterGetting(this);
2,建立OnDemandServerMediaSubsession的子类,AudioServerMediaSubssion
1)实现两个接口:createNewRTPSink和createNewStreamSource
2)createNewStreamSource使用FramedAudioSource创建
3)createNewRTPSink
RTPSink* AudioServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock,
unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource) {
return SimpleRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
m_timeStampFrequency, "audio", m_audioType, 1, False, False);
}
这个函数中,关键的有:
m_timeStampFrequency,根据实际情况填写16000或者8000等采样率
m_audioType,编码方式,例如:"G726-40"。这个准确的定义,请参照MediaSession::createSourceObjects中的内容



六、音频与视频同时提供
这个就简单了,只要sms->addSubsession多来几次,添加多个Subsession即可。


最后、其它遇到的问题:
1,当连接断开时,FrameLiveSource会被释放。再连接时重新建立。所以要做好数据的释放与分配的处理
 同时也要注意数据释放的瞬间,多线程异步问题导致的问题
2,StreamParser.cpp中,BANK_SIZE的大小,需要做对应的修改,以便容纳足够大的数据
3,env(),这个东西一定要关心。继承一个类,实现setResultMsg可用于输出live555本身的一些信息。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: live555是一个基于C++的开源流媒体服务器,是由美国的Live Networks公司开发并维护。它的主要功能是在网络上实现实时流传输,支持RTSP、RTP/RTCP和SIP等协议。 在使用live555推送实时流之前,我们需要先设置好服务器地址、端口号以及媒体文件等参数。然后,我们通过live555中的MediaSession类,创建一个媒体会话,将需要传输的媒体流加入到会话中。媒体流可以是音频或视频,也可以是音视频混合的多媒体流。 接着,我们使用live555提供的MediaSubsession类,将加入媒体会话的媒体流进行分割。分割后的媒体流将按照RTSP或RTP协议进行传输,可以通过RTSP或RTP服务器进行接收。其中,RTSP用于控制媒体流的播放、暂停、停止等操作;而RTP则是在网络传输中实现实时数据传输和同步的协议。 总的来说,通过使用live555的媒体会话和媒体分割功能,我们可以轻松地实现实时流的推送和传输,为视频监控、视频会议、实时视频直播等应用提供了非常可靠和高效的技术支持。 ### 回答2: Live555是一个开源的C++多媒体流框架,可用于实现实时流的推送。Live555提供了一套完整的库和工具,能够支持常见的视频和音频流协议,例如RTSP,RTP,RTCP等。 实时流推送的过程可以概括为以下几个步骤: 1. 创建一个`RTSPServer`实例,用于接收客户端的连接请求。 2. 为需要推送的媒体资源创建一个`MediaSession`实例,并将其添加到`RTSPServer`中。 3. 创建一个`RTSPClientConnection`实例,用于处理客户端的连接和请求。 4. 在`RTSPSession`中添加需要推送的媒体资源,并为其创建一个`RTPSink`实例,用于将媒体数据发送到客户端。 5. 创建一个`MediaSource`实例,用于从媒体源(例如摄像头或音频设备)中获取实时数据。 6. 将`MediaSource`连接到`RTPSink`,并启动数据传输。 7. 开始监听客户端的连接请求,并响应相应的RTSP请求。 8. 当有客户端连接成功后,将媒体数据通过RTP协议发送给客户端。 9. 如果有多个客户端连接,可以使用多线程或多进程来处理并发连接。 通过以上步骤,Live555可以实现将实时流从媒体源推送到客户端。实时流推送广泛应用于视频直播、视频会议等领域,能够实现高效的实时数据传输和播放。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值