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
现在我把我这一段时间学习所得给大家分享一下,希望对新接触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
相关文章推荐
- live555杂谈系列(一)---source,sink简介
- 流媒体学习笔记3(live555的source-sink)
- 从无到有系列之flume的source-channel-sink汇总03
- 杂谈(8)Microsoft Office 系列办公软件交流学习平台简介
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战008-DataStream与MySql自定义sink和source(Scala版)003
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战007-DataStream与MySql自定义sink和source(Scala版)002
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战012-Flink在流处理中常见的sink和source001
- live555 请求流程图------------------rtsp如何建立,rtsp source和sink怎么交互数据
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战006-DataStream与MySql自定义sink和source(Scala版)001
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战010-DataStream与MySql自定义sink和source(Java版)002
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战011-DataStream与MySql自定义sink和source(Java版)003
- Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战013-Flink在流处理中常见的sink和source002
- 云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战009-DataStream与MySql自定义sink和source(Java版)001
- SDL系列教程(一):SDL简介
- Visual SourceSafe 数据库安全性简介
- IBM服务器系列产品分类简介
- [翻译]Scott Mitchell谈DataSource系列之一:Data Source Control Basics