Live555 源代码分析(三)

2020-09-22  本文已影响0人  RonZheng2010

1 发送数据帧

1.1 MP3SreamState

MP3StreamState直接读MP3文件。MP3FrameParams保存帧数据。

成员函数findNextHeader()和readFrame()配合使用,可以读取一帧数据。

1.2 MediaSource

MediaSource定义媒体源访问接口。(从命名看是这样,但实际上它没定义什么。)

FramedSource定义以帧为基础的媒体源接口。

FramedFileSource是基于文件的FramedSource。

MP3FileSource是MP3文件的媒体源的访问接口。

用MP3FileSource::createNew()创建MP3FileSource实例。

以MP3FileSource为例说明成员函数getNextFrame(),它负责从媒体源中读取下一帧。

在延时任务FramedSource::afterGetting()中,

1.3 MediaSink

1.3.1 MediaSink接口

MediaSource是数据源,MediaSink则访问这个数据源,对外提供数据。

MediaSink定义了访问接口。

RTPSink在MediaSink基础上,

1.3.2 MultiFrameRTPSink

MultiFramedRTPSink实现了continuePlaying()和stopPlaying()。

以MultiFrameRTPSink为例,说明成员函数startPlaying()。它开始播放,也就是解析帧并发送给客户端。

在MultiFramedRTPSink::afterGetttingFrame()中,调用sendPacketIfNecessary()。后者调用RTPInterface::sendPacket()将帧发送出去。

1.3.3 MPEG1or2AudioRTPSink

MultiFramedRTPSink也定义一个虚拟函数doSpecialFramedHandling()。这个函数在afterGettingFrame1()中被调用,以便它的派生类,比如MPEG1or2AudioRTPSink,对构造数据包的过程做更多定制。

1.4 另一种MediaSource

1.4.1 FramedFilter

FramedFilter是另一种MediaSource,更准确地说,是另一种FramedSource。

1.4.2 Segment和SegmentQueue

Segment用于保存MP3帧的数据。

SegmentQueue是一个Segment的容器。

成员函数enqueueNewSegment()从FramedSource实例中读取帧,写入成员s的下一个空闲元素。

读帧完成后,sqAfterGettingSegment()函数被调用。

1.4.3 ADUFromMP3Source和MP3FromADUSource

MP3FromADUSource和MP3FromADUSource是FramedFilter的两个例子。

ADUFromMP3Source::createNew()创建ADUFromMP3Source实例。

ADUFromMP3Source定制了虚拟成员函数doGetNextFrame()。

上一篇 下一篇

猜你喜欢

热点阅读