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

来源:互联网 发布:昆仑万维 知乎 编辑:程序博客网 时间:2024/05/18 03:26

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

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

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

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

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

[cpp] view plaincopy
  1. <span style="font-size:16px;">sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));</span>  


 

我们追踪H264VideoFileServerMediaSubsession代码:

 

 

[cpp] view plaincopy
  1. <span style="font-size:16px;">FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {  
  2.     estBitrate = 500; // kbps, estimate  
  3.   
  4.     // Create the video source:  
  5.     ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);  
  6.     if (fileSource == NULL) return NULL;  
  7.     fFileSize = fileSource->fileSize();  
  8.   
  9.     // Create a framer for the Video Elementary Stream:  
  10.     return H264VideoStreamFramer::createNew(envir(), fileSource);  
  11. }  
  12.   
  13. RTPSink* H264VideoFileServerMediaSubsession  
  14.     ::createNewRTPSink(Groupsock* rtpGroupsock,  
  15.     unsigned char rtpPayloadTypeIfDynamic,  
  16.     FramedSource* /*inputSource*/) {  
  17.         return H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);  
  18. }  
  19. </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的,我也是新手,没追踪到,希望追踪的高人给个答案。

 

 

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

http://blog.csdn.net/cll131421/article/details/7745055

0 0
原创粉丝点击