使用FFmpeg转码,会遇到了各种情况的音视频不同步,下面我们就来根据问题出现的原因,对所遇到的音视频不同步做一个分类。

1. 源本身音视频不同步且无法播放

这种情况极为罕见,在A客户东方卫视频道转码时遇到过。

表现为输出的音视频严重不匹配,录制下来的视频源无法播放,要么只有声音没有图像,要么只有图像没有声音,且图像播放卡顿。

解决方案:转码器无法修复这种异常源,需要反馈给源提供方修复。

2. 源本身的时间戳问题,但源可正常播放

这种情况较少见,在M客户湖南卫视直播源时出现过。

表现为转码出来的视频图像播放正常,但是没有声音。录制下来的视频源能正常播放。

分析方法:打印出输入AVPacket包的时间戳,发现音频包的PTS正常,而DTS长时间不变。

解决方法:读出音频数据包后,如果判断DTS != PTS,则强制将DTS设为PTS的值。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

3. 一段时间内,只丢失一个流的数据

在M客户的中国气象频道转码过程中遇到。

表现:输入源有数据持续输入的情况下,转码有一段时间没有输出,且恢复输出后播放没有声音。

分析方法:录制出问题时间段的视频源,分析其中的音视频数据包及时间戳。分析发现在一段时间之内,大概几秒到十几秒,输入的音频流丢失而视频流正常,导致在输出交织时一直等不到音频流而不断地buffer数据,直到音频流恢复后,或者等待超时后才有数据输出,而输入音频流恢复后,由于FFMPEG中执行了如下代码调整了原本正常的音频时间戳,使得音频时间戳错乱,导致播放时只有画面而没有声音。

4. 源的部分视频帧未设置时间戳

在一些客户的直播转码过程中,输入输出帧率相同的情况下,会遇到log中大量打印“Past duration XXX too large”且伴有frame drop相关信息的打印。

分析方法:将输入视频包的时间戳信息打印出来,发现一些视频帧未设置DTS/PTS,这些视频帧携带的时间戳都是默认值为AV_NOPTS_VALUE,代码中对该值的定义如下:

#define AV_NOPTS_VALUE ((int64_t)UINT64_C(0x8000000000000000))

而这些帧在编码输出之前会被Drop掉,为了满足设定的帧率,后面的有效时间戳的帧会提前输出,导致视频提前而音频滞后。

解决方法:由于我们为这些未设置时间戳的输入帧填充有效时间戳不是一件很容易的事(需要结合输入视频是否采用B帧等),因此在输入输出帧率相同时,我们可以将这些携带无效时间戳的帧正常送至编码器编码并输出,而不是丢弃。

5. "dts < pcr"

在线CBR转码时常遇到"dts < pcr, TS is invalid"的打印,时间久了也可能引起输出码流的音视频失步。

首先我们先看看代码中PCR的计算,

可见PCR的值与muxrate和写入到AVIOContext中的数据量有关系。

在保证封装码率稳定的前提下,我们需要关注写入到AVIOContext中的音视频数据的速度。一般音频编码的速率较为稳定,而视频编码速度受B帧策略的影响较大,当视频编码使用较多的B帧时,由于是双向预测,导致编码速度慢于时间戳相近的音频帧,而当视频帧编码完成并输出时,AVIOContext中已经填充了较多的音频帧,使得PCR值超过了当前输出的视频帧的DTS,即出现了“dts < pcr”的打印。

解决方法: 在线转码时,在对视频质量没有特别要求的前提下,优先保证编码速度,就x264编码器来说,可以使用zerolatency策略,禁掉B帧的使用并尽量降低编码延迟。

6. 循环源与非单调时间戳

在M客户电竞直播与H客户云转码项目中都遇到了这种循环源与非单调时间戳问题。

FFMPEG默认只支持单调时间戳,一旦遇到非单调时间戳,FFMPEG会强制修改输出时间戳,代码如下,

但修改后的时间戳是不正常的,导致输出视频播放异常。具体表现为,若为音视频透传,则输出的音视频均异常;若转码,输出的视频正常,而音频异常,这是因为视频编码器会根据帧率和输出的帧数重新计算时间戳,而音频时间戳则是继承了输入时间戳,从而输出的视频时间戳为单调递增的正常值,而音频时间戳为FFMPEG强制修改后的值,导致播放没有声音。

解决方法:

包括三个方面,

1. 将以上截图部分对时间戳的修改注销;

2. 取消由于非单调时间戳导致的转码退出:

3. 需要转码时,由于视频转码输出时间戳为单调递增,为了使音频时间戳与视频时间戳同步,需要将音频时间戳按照单调递增的顺序来说出,算法设计时需要考虑时间戳跳变、丢帧等各种情况的处理。

7.长时间转码后出现轻微音视频不同步

这种音视频不同步暂时没有找到根本原因,多见于网络不稳定时,对音视频丢帧数量统计不精确导致网络恢复后时间戳出现轻微不对齐,且随着转码时间的延长或者网络波动情况的增多,不同步程度会加重。由于暂时无法确定具体原因,且一般在转码几天之后才出现,因此针对该情况的处理方案是,设计一套音视频不同步检测算法来评估音视频不同步的程度,当达到一定的阈值后,通知前端重启转码器以达到重新同步。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

FFmpeg转码音视频不同步情况总结相关推荐

  1. php音视频同步,FFMPEG转码音视频不同步情况总结

    [导读]使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同步,下面我们就来根据问题出现的原因,对所遇到的音视频不同步做一个分类. 使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同 ...

  2. 用FFMPEG SDK进行视频转码压缩时解决音视频不同步问题的方法(转) PTS DTS

    用FFMPEG SDK进行视频转码压缩的时候,转码成功后去看视频的内容,发现音视频是不同步的.这个的确是一个恼火的事情.我在用FFMPEG SDK做h264格式的FLV文件编码Filter的时候就碰到 ...

  3. python中使用ffmpeg进行视频指定时长截断(解决剪切后音视频不同步的问题)

    1. 获取视频时长 有两种方式获取视频总时长: python-ffmpeg( 获取的是视频总秒数 ) video_time = float(ffmpeg.probe(video)['format'][ ...

  4. FFmpeg学习(音视频理论知识)

    文章目录 1. 音视频理论知识 1.1 基本概念 1.1.1 音视频必备的基本概念 常用的视频封装格式 常用的视频编码器 常用的音频编程器: 视频流 裸数据YUV 1.1.2 音视频常见处理 采集 处 ...

  5. FFmpeg 工具:音视频开发都用它,快@你兄弟来看丨音视频工具

    (本文基本逻辑:ffmpeg 常用命令介绍 → ffplay 常用命令介绍 → ffprobe 常用命令介绍) 从事音视频开发的程序员几乎都应该知道或使用过 FFmpeg.FFmpeg 是一个开源软件 ...

  6. 使用FFmpeg命令处理音视频

    文章目录 前言 一.ffprobe相关命令 1.使用ffprobe查看音频文件的信息 2.使用ffprobe查看视频文件的信息 二.ffplay相关命令 1.基本的ffplay命令 2.音视频同步命令 ...

  7. 基于FFmpeg 实现RTSP, 音视频编解码,视频流添加文字,音视频合成MP4

    前言: 最近闲这没事,整理了一下之前开发过的音视频编解码库,主要基于ffmpeg,实现音视频的编解码.视频流添加文字,音视频同步到MP4等功能.有需要的小伙伴可以参考参考,如果写的有什么不对的地方,欢 ...

  8. 互动协作白板与音视频实时同步技术实践

    本文整理自即构科技互动白板技术负责人陈晓聪在LiveVideoStack的线上分享,内容主要围绕白板与音视频的同步和白板的多端实时互动两个角度,深度解析即构在互动白板方面的技术探索实践. 文 / 陈晓 ...

  9. 音视频的同步原理——老文章,比较清晰

    http://blog.csdn.net/beyond_cn/article/details/20310177 1.   音视频同步的原理 2.  音视频同步的较正方法 3.  音视频同步时遇到的问题 ...

  10. IOS_音视频不同步问题

    音视频不同步 1.问题现象:iOS版本在网络环境差的情况下,会比较容易出现音视频不同步的问题 2.问题分析: 经多次测试发现,观看时间越长,音频延迟的越严重: 然后查看Log,发现音频接收缓存队列中并 ...

最新文章

  1. 国内最牛的Java面试八股,真offer收割机!
  2. Android Studio 一些方便使用的设置
  3. python无法安装tensorflow_python – 无法安装Tensorflow Mac
  4. Kafka解惑之Old Producer(2)——Sync Analysis
  5. GLSL中 Billboard和Point的顶点空间变换
  6. 关于Date类型、时间戳格式转换方法
  7. Docker 安装、镜像、dockerfile、容器、仓库
  8. 共226款Html5小游戏源码分享
  9. python类似图片查找_python检测相似图片
  10. 华硕笔记本屏幕亮度怎么调节?屏幕亮度调节方法
  11. C语言:va_list的用法
  12. android端向后台传图片,Android前台从后台下载一张图片 以及 Android前台上传一张图片到后台...
  13. uniApp学习(8)搜索框的创建和自动获取焦点
  14. ABAP AMDP数据库存储过程(数据源)
  15. [转]手机按键生产工艺简介
  16. oracle 证件脱敏存储过程
  17. python照片转手绘_python中如何将照片手绘化?
  18. Linux教程之删除文件(rm,rmdir)
  19. 华南农业大学C语言程序设计课后习题(第五章)已修改
  20. 管理自己[Managing Oneself]

热门文章

  1. 高效记忆/形象记忆(06)110数字编码表 01-10
  2. k9s加速k8s集群管理
  3. 前端生成小程序二维码
  4. 人工智能之神经网络基础入门(最通俗版)
  5. 浙大计算机考研分数线2016,浙江大学2016考研复试分数线
  6. STM32简介(系统结构、引脚定义……)
  7. cvs数据格式 gps_CSV、TXT 和 GPX 文件
  8. PDF文件转化成mobi格式,亲测kindle或者iReader可用!
  9. html5在线加密,HTML源代码在线加密解密
  10. HTML5响应式手机模板:IOS风格app手机个人中心页面模板HTML+CSS+JavaScript