- 功能:渲染音频
- 接口:DLAudioOutput
- 协议:DLAudioOutputProtocol / DLAudioOutputPrivateProtocol
- 概述:消费音频数据,提供填充音频数据的回调,平台音频库内部线程主动请求数据
请求方式:
void(^DLAudioOutputFillDataBlock)(float *data, UInt32 numFrames, UInt32 numChannels)
AudioOutput主动调用此Block以请求音频数据,
由调度器(PlayerController)决定如何实现Block以响应音频请求
- 功能:渲染视频
- 接口:DLVideoOutput
- 协议:DLVideoOutputProtocol / DLVideoOutputPrivateProtocol
- 概述:消费视频数据,提供接收视频帧的接口
接收方式:- (void)render:(nullable id)frame
由调度器(PlayerController)决定如何向VideoOutput发送视频帧
- 功能:音画同步
- 接口:DLAVSynchronizer
- 协议:DLAVSynchronizerProtocol / DLSynchronizerPrivateProtocol
- 概述:为AudioOutput和VideoOutput提供音视频数据,维护解码线程,处理对齐逻辑
音频接口:
- (void)fillAudioData:(float *_Nullable)outData numFrames:(UInt32 )numFrames
numChannels:(UInt32 )numChannels;
由调度器(PlayerController)调用,把音频请求传递给AVSync,AVSync向outData地址填充数据
视频接口:- (void)fillVideoData:(id_Nullable)frame;
委托方法,AVSync把准备好的视频帧通过此方法交给其委托对象,
由委托对象(这里是PlayerController)决定视频帧的去向
音视频对齐:内部逻辑,外界无需知道
对齐策略:目前采用音频向视频对齐
视频对齐模型:
理想情况:当前视频帧PTS - 参考视频帧PTS == 当前系统时间 - 参考时间
即视频帧之间展示到屏幕上的时间间隔 == 它们PTS之间的间隔;
播放较快:两帧展示到屏幕上的时间差 < 它们PTS差值;
修正策略:增大下一次调用tick函数的时间,给“理想时间”加上一个“修正值”
播放较慢:两帧展示到屏幕上的时间差 > 它们PTS差值;
修正策略:减小下一次调用tick函数的时间,给“理想时间”减去一个“修正值”
词语说明:
tick函数:控制渲染视频的节拍,内部不断在修正下一次渲染的时间
理想时间:当前帧的duration,即展示多久
修正值:根据播放速度快慢,计算出来一个时间值,决定下一次调用tick函数时机
音频对齐模型:每次从音频队列取出待渲染的音频帧,和播放器时钟(视频渲染时钟)对比; 若音频渲染过慢或过快(超出预设的阈值),则丢弃,反之拷贝到目标地址;
- 功能:解协议、解封装、解码,生产音视频数据,供AVSync调用
- 接口:DLDecoder
- 协议:DLDecoderProtocol / DLDecoderPrivateProtocol
- 概述:提供解析协议、解码接口,其工作线程由调用方决定
打开文件:- (BOOL)openFile:(NSString *)path error:(NSError **)perror;
解封装、解码:- (NSArray *)decodeFrames:(NSTimeInterval)minDuration;
- 功能:负责调度AudioOutput、VideoOutput、AVSync三个模块,供客户端调用
- 接口:DLPlayerController
- 协议:DLPlayerControllerProtocol / DLPlayerControllerPrivateProtocol
- 概述:播放器入口,传递用户交互行为,输出播放器状态信息
关键属性:playerView,输出视频画面,客户端获取之后将其添加到指定的view即可