24.Eclipse下Ndk开发_项目结构重构(ffmpeg音视频同步播放)

使用生产者消费者模式重构项目,实现音视频同步播放

音视频同步涉及到的知识

1.IPB帧

a) I帧:关键帧,I 帧图像采用帧内编码方式,帧内压缩,包含完整的画面
b) P帧:差别帧,与上一个关键帧的差别,需要缓存上一帧才能得到完整的画面
c) B帧:双向差别帧,与前后两帧的差别,需要缓存上一帧和下一帧 才能得到完整画面,P 帧和 B 帧图像采用帧间编码方式

2.如何判断帧的类型

AVFrame->pic_type
AVPacket->flags & AV_PKT_FLAG_KEY

3.DTS和PTS

DTS:Decoding Time Stamp 解码时间戳
PTS:Presentation Time Stamp 显示时间戳

DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像

音视频流中的每一帧都有时间相关的信息,其中PTS是播放时间,DTS是解码时间。音频的PTS和DTS是一致的,而某些视频各种中可能会存在DTS和PTS不一致的帧,我们这里主要通过PTS来控制播放时间。对解码后的AVFrame使用av_frame_get_best_effort_timestamp可以获取PTS。

为什么说音频的PTS和DTS是一致的,而某些视频各种中可能会存在DTS和PTS不一致的帧?当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,解码顺序和播放顺序就不一致了,原因在于B 帧图像采用双向时间预测,采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致,顺序被打乱。所以视频中可能存在不一致的情况,而音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的

4.FFmpeg中的时间单位

time_base 时间单位(时间基)
不同的结构体又不同的时间单位,AVStream stream中
time = stream->duration
stream->time_base

5.音视频同步的三种方案

a) 音频同步视频
b) 视频同步音频
c) 标准时间(同步音频和视频到外部时钟)

你可能感兴趣的:(24.Eclipse下Ndk开发_项目结构重构(ffmpeg音视频同步播放))