您的位置:首页 > 其它

live555杂谈系列(一)---source,sink简介

2014-09-11 23:28 288 查看
最近一段时间一直在学习live555,相信各位新手朋友们一开始肯定跟我一样,在网上查看各种资料,可是看完之后依然是一头雾水。

现在我把我这一段时间学习所得给大家分享一下,希望对新接触live555的新手们有所帮助,高手请绕行,不喜勿喷,谢谢合作。

首先来说一下live555的学习步骤,首先live555自带的例子一定要仔细研究一下,可以给我们很多启发。

其次,一定要把握好live555的脉络,大家应该都知道live555中数据的流向是source1àsource2(filter)àsource3(filter)àsink。可是这些source、filter和sink都是什么呢?现在我给大家简单分析一下。

我们以服务器端为例,我们可以查看live555自带的例子MediaServer,我们看到服务器会根据客户端的请求,创建一个媒体子回话,代码如下:

[cpp] view
plaincopy

<span style="font-size:16px;">sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));</span>

我们追踪H264VideoFileServerMediaSubsession代码:

[cpp] view
plaincopy

<span style="font-size:16px;">FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {

estBitrate = 500; // kbps, estimate

// Create the video source:

ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);

if (fileSource == NULL) return NULL;

fFileSize = fileSource->fileSize();

// Create a framer for the Video Elementary Stream:

return H264VideoStreamFramer::createNew(envir(), fileSource);

}

RTPSink* H264VideoFileServerMediaSubsession

::createNewRTPSink(Groupsock* rtpGroupsock,

unsigned char rtpPayloadTypeIfDynamic,

FramedSource* /*inputSource*/) {

return H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);

}

</span>

大家仔细看一下,可以很清楚的看到,上面是创建了一个source,而下面则创建了一个RTPSink。这就是上面的数据通路中最原始的source和最终的sink了。数据是怎么一步一步从source走到sink呢,我们接着看。

Source中首先创建了一个ByteStreamFileSource,然后ByteStreamFileSource作为一个参数传递给H264VideoStreamFramer,最后返回的是一个H264VideoStreamFramer,我们接着追踪H264VideoStreamFramer的代码,我们会发现H264VideoStreamFramer继承自MPEGVideoStreamFramer。我们都知道子类在构造的时候是先调用基类的构造函数,然后再调用自身的构造函数,所以我们在返回H264VideoStreamFramer的时候,其实已经调用了MPEGVideoStreamFramer的构造函数。

相信追踪到这里,大家应该明白了吧真正的source其实是ByteStreamFileSource,大家看一下ByteStreamFileSource的代码就会发现,其实就是实现了从文件中读取数据的功能,这就是服务器真正的source源头了。

然后根据类的继承,一步一步的调用XXXFramer,其实这些Framer就是filter,各级的filter实现自己的功能之后,果断的交给上一层处理。数据最后会移交到MultiFramedRTPSink,通过buildAndSendPacket这个函数将数据发送出去。至于数据是如何从Framer到MultiFramedRTPSink的,我也是新手,没追踪到,希望追踪的高人给个答案。

以上只是个人的一些看法,由于是新手,难免有所错误,希望各位看客看到错误之后一定指出来啊。

/article/8080365.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐