您的位置:首页 > 其它

live555对于实时音视频的支持

2013-04-26 14:58 197 查看
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本身的一些信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐