最近一段时间一直在学习live555,相信各位新手朋友们一开始肯定跟我一样,在网上查看各种资料,可是看完之后依然是一头雾水。
现在我把我这一段时间学习所得给大家分享一下,希望对新接触live555的新手们有所帮助,高手请绕行,不喜勿喷,谢谢合作。
首先来说一下live555的学习步骤,首先live555自带的例子一定要仔细研究一下,可以给我们很多启发。
其次,一定要把握好live555的脉络,大家应该都知道live555中数据的流向是source1àsource2(filter)àsource3(filter)àsink。可是这些source、filter和sink都是什么呢?现在我给大家简单分析一下。
我们以服务器端为例,我们可以查看live555自带的例子MediaServer,我们看到服务器会根据客户端的请求,创建一个媒体子回话,代码如下:
- <span style="font-size:16px;">sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));</span>
我们追踪H264VideoFileServerMediaSubsession代码:
- <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的,我也是新手,没追踪到,希望追踪的高人给个答案。
以上只是个人的一些看法,由于是新手,难免有所错误,希望各位看客看到错误之后一定指出来啊。