live555杂谈系列(一)---source,sink简介
来源:互联网 发布:昆仑万维 知乎 编辑:程序博客网 时间:2024/05/18 03:26
最近一段时间一直在学习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的,我也是新手,没追踪到,希望追踪的高人给个答案。
以上只是个人的一些看法,由于是新手,难免有所错误,希望各位看客看到错误之后一定指出来啊。
http://blog.csdn.net/cll131421/article/details/7745055
- live555杂谈系列(一)---source,sink简介
- 流媒体学习笔记3(live555的source-sink)
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
- live555 请求流程图------------------rtsp如何建立,rtsp source和sink怎么交互数据
- 从无到有系列之flume的source-channel-sink汇总03
- 深入浅出DNS系列(一)- DNS杂谈
- live555 source
- flume自定义sink source
- Flume学习进阶(一):source、channel、sink、processor、interceptor等组件列表说明及包含的类型介绍
- Source(拉电流) Sink(灌电流)详解
- live555笔记(一)
- EJB系列(一)---简介
- Mysql系列(一) 简介
- flume source、sink、Channels测试
- flume之source,channel,sink
- live555简介
- live555 简介
- 冒泡排序
- SDUTOJ2128 二叉排序树
- Getting Spark Setup in Eclipse
- Android加速度传感器的使用:摇一摇功能的实现
- 鸡尾酒排序
- live555杂谈系列(一)---source,sink简介
- 事件与委托
- 一个适合的火车站的idea
- 福利来了,晒书评送书活动启动了
- 地精排序
- 好人的路——读《追风筝的人》
- PHPExcel读取excel文件示例
- tomcat部署web项目的3中方法
- kmp就这么完了。