音视频同步问题

音视频流里都包含了播放速率的信息,音频使用采样率来表示,而视频则采用f/s来表示,但是我们却不能简单地用这两个数据来对音视频进行同步,我们需要使用DTS(解码时间戳)和PTS(播放时间戳)这两个数据;我们知道影视数据在存储时,会存在多种帧形式,例如MPEG中就采用了I,B和P,由于B帧的存在使得PTS和DTS存在不同(原因见附录),如图1所示为一个简单的例子;当然真正影响我们音视频同步的是PTS。

我们可以从影视文件中获得包的PTS,但是我们无法直接获得帧(我们真正关心的)的PTS,解决办法是用一帧的第一个包的PTS作为这一帧的PTS,这是可行的,因为当一个包开始一帧时,avcodec_decode_video()会调用为帧申请存储空间的函数,我们可以重写这个函数,在其中加入获取包DTS的方法(这是很容易的),因为ffmpeg会重新给包进行排序,因此被avcodec_decode_video()处理过的包的DTS和返回的帧的PTS是相同的,这样就可以得到帧的PTS了。当然有时我们可能没法得到这个PTS,那样我们使用内部video_clock(记录视频已经过去的时间);

这样我们就可以使用PTS来重新队列化我们的帧(queue_picture);

然后,我们可以去获得音频的播放时间PTS。

get_audio_clock():

把audio_clock作为音频的pts,但是在audio_decode_frame()计算的audio_clock的是假定缓冲满的情况,而实际上可能缓冲是不满的,我们需要减去空闲的部分的时间:pts -= (double)hw_buf_size / bytes_per_sec;

audio_decode_frame():音频解码

读取包时,获取其pts,放入audio_clock中;

播放时根据缓冲大小和播放速率计算播放时间;

获得这两个pts后,我们有三个选择:视频同步音频(计算音视频PTS只差,来决定视频是否有延迟)、音频同步视频(根据音视频PTS差值调整音频取的样值,即改变音频缓冲区的大小)和音频视频同步外部时钟(同前一个)。

附录:

I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。

P frame: 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;

B frame: 双向预测内插编码帧 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;

I frame:  自身可以通过视频解压算法解压成一张单独的完整的图片。

P frame:需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。

B frame:则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。

I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.

FFmpeg音视频同步的问题相关推荐

  1. NDK学习笔记:FFmpeg音视频同步3(你追我赶,升级ffmpeg/libyuv支持neon)

    NDK学习笔记:FFmpeg音视频同步3 本篇内容说多不多,但如果要说得明明白白的,可能就有点难度了.所以我决定把我的调试过程日志都呈现出来,方便大家理解.继上一篇文末,我们学习到了什么是DTS/PT ...

  2. FFMPEG音视频同步-音视频实时采集并编码推流

    FFMPEG音视频同步-音视频实时采集并编码推流 //------------------------------------------------------------------------- ...

  3. FFmpeg 音视频同步

    原地址:http://www.jianshu.com/p/27279255f67e 音视频播放器的工作的具体流程如下图所示: 播放器工作流程 简单的来说包括:解协议,解封装,对音频和视频分别进行解码, ...

  4. FFmpeg音视频同步基础知识

    1. I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像.因此在I帧 ...

  5. FFMPEG音视频同步-音视频实时采集并编码推流-优化版本

    https://blog.csdn.net/quange_style/article/details/90213392

  6. FFMPEG音视频同步-音频实时采集编码封装成MP4

    https://blog.csdn.net/quange_style/article/details/90083173

  7. ffmpeg源码中ffplay音视频同步原理及实现

    音视频指南 文章目录 音视频指南 前言 一.音视频同步简单介绍? 二.基本概念解释 1.为什么需要视频压缩 2.什么是I帧.p帧.b帧 3.什么是DTS,PTS 4.其他概念解释 三.常用同步策略 四 ...

  8. ffmpeg入门小结(二)——音视频同步

    1.H264格式简介(视频解码同步相关) ---------------------- 前言 ----------------------- H264是新一代的编码标准,以高压缩高质量和支持多种网络的 ...

  9. ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步

    ## 一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文 ...

  10. 音视频同步原理[ffmpeg]

    音视频同步原理[ffmpeg] output_example.c 中AV同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题. 阅读前希望大家先了解一下时间戳的概念. /* compu ...

最新文章

  1. JS常用的设计模式(7)—— 外观模式
  2. 路由器DHCP服务器及PPP封装验证
  3. vue进入页面执行的钩子函数_解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题...
  4. ++代码实现 模糊综合算法_干货 | 十大经典排序算法最强总结(内含代码实现)...
  5. python new_python __new__中单例的作用
  6. 1051. 复数乘法 (15)-PAT乙级真题
  7. 交换机芯片笔记1.1
  8. AppleALC.kext驱动支持的硬件型号与ID速查列表:
  9. 《批判性思维》感1.1-[信念执念断言]
  10. 医院计算机网络系统的现状,医院信息系统应用的现状与发展
  11. vue项目打包成app
  12. ClientToScreen ScreenToClient GetWindowRect GetClientRect
  13. 超快全球任播OCSP:白嫖谷歌云免费SSL证书!
  14. Chrome断点调试
  15. JSON解决乱码问题
  16. TMS320f28335实现步进电机的驱动程序及原理分析
  17. ROS学习笔记之小乌龟跟随
  18. TPLINK TL-AP1300I-PoE功能失常导致网络故障一例
  19. Linux修改密码提示鉴定令牌操作错误
  20. 还敢随便抄?Stack Overflow上最火这段代码有Bug!

热门文章

  1. elasticdump安装_elasticsearch导入导出工具elasticdump安装和使用小记
  2. Spring Cloud Alibaba系列教程-03-搭建生产可用的Nacos集群
  3. Linux 要如何查看系统架构
  4. C言语次序查找算法及代码
  5. jquery设置元素的readonly和disabled
  6. rsync文件同步应用--客户端的配置
  7. 本地管理表空间(LMT)
  8. SpringBoot @Condition 注解
  9. idea中有些类明明在jar包里有,但是却搜不到
  10. sql 的 where 和 having 的区别和用法