- 一、功能描述
该类sink作为最终数据的接收者,FramedSource一直读取数据并生成媒体的帧;sink则从FramedSource中获取帧的数据处理;比如RTPSource不断的从socket读取数据并解析成完整的一帧保存;DummySink则一帧一帧的读取数据返回给APP.
- 二、继承关系
DummySink –> MediaSink -> Medium
同样继承Medium,该类可以保存在env的队列中可以通过name查找。
- 三、代码分析
3.1 MediaSink分析
最重要定义了启动sink的startPlaying接口和流程控制的continuePlaying虚函数接口;APP调用启动接口初始化后,调用continuePlaying通知app调用FramedSource的获取帧接口并设置回调afterGettingFunc,FramedSource获取一帧后调用afterGettingFunc通知APP处理该帧数据(比如app获取一帧数据后调用ffmpeg解码,显示);在afterGettingFunc又调用了continuePlaying通知app调用FramedSource的获取帧;这样就完成的闭环,这个流程就跑起来了。FramedSource一直生成数据帧,sink一直读取数据帧播放。
class MediaSink: public Medium {
public:
// 定义启动接口,参数定义:
// source: 数据生成的source,如RTPSource
// afterPlayingFunc: 媒体结束的回调函数
typedef void (afterPlayingFunc)(void* clientData);
Boolean startPlaying(MediaSource& source,
afterPlayingFunc* afterFunc,