当前位置: 首页 > news >正文

音视频同步笔记 - 以音频时间为基

音视频同步 - 以音频时间为基

在这里插入图片描述

上图介绍:

  • 该图是以音频的时间为基,对视频播放时间的延迟控制方案,只调整视频的播放延时。
  • delayTime是视频播放的延迟时间,初始值是1 / FPS * 1000 (ms),如果FPS为25帧率,初始值即为40ms。为理解同步过程,明确一点,delayTime是会不断调整的,并不是一直40ms。
  • 以上的time_base,结构体是AVStream::time_base。
  • Step2中展示的是diff(音视频播放时差)处于不同范围时,对应不同的视频播放延迟时间(delayTime)。

流程:

Step1:判断 音频帧 or 视频帧 快 ?

时间差(diff) = 音频播放时间 - 视频播放时间;

Step2:当diff > 0 ms 时,说明音频帧比视频帧快:

音频帧比视频帧快,视频帧应该追赶音频帧,所以应该减少视频帧的延迟时间。

diff(音视频播放时差)处于不同范围的处理情况:

音视频播放时差范围
3ms - 500ms
500ms - 10000ms
> 10000ms

(1)3ms - 500ms:

​ 视频帧慢了3ms - 500ms,将上一次delayTime乘以2/3,达到减少视频延迟时间的效果。

delayTime = delayTime * 2 / 3

当diff处于3 - 500 ms这个范围,视频延迟时间(delayTime)要求,不能低于默认延迟时间(defaultDelayTime,25帧则为40ms)的一半,也不能大于默认延迟时间的两倍。

  • 如果delayTime小于默认延迟时间的一半,将delayTime调整为默认延迟时间(defaultDelayTime)的2/3。
  • 如果delayTime大于默认延迟时间两倍,将delayTime调整为默认延迟时间(defaultDelayTime)的两倍。

(2)500ms - 10000ms:

视频帧慢了500ms - 10000ms,将delayTime设置为0。

(3)diff > 10000ms

视频帧和音频帧差距很大了,无法通过追赶达到同步,应该将视频缓存队列清空,直接引入最新鲜的视频帧。


Step2:当diff < 0 ms 时,说明音频帧比视频帧快:

音频帧比视频帧慢,视频帧应该等一下音频帧,所以应该增加视频帧的延迟时间。

diff(音视频播放时差)处于不同范围的情况:

(1)3ms - 500ms:

​ 视频帧快了3ms - 500ms,将上一次delayTime乘以3/2,达到增加视频延迟时间的效果。

delayTime = delayTime * 3 / 2

当diff处于3 - 500 ms这个范围,视频延迟时间(delayTime)要求,不能低于默认延迟时间(defaultDelayTime,25帧则为40ms)的一半,也不能大于默认延迟时间的两倍。

  • 如果delayTime小于默认延迟时间的一半,将delayTime调整为默认延迟时间(defaultDelayTime)的2/3。
  • 如果delayTime大于默认延迟时间两倍,将delayTime调整为默认延迟时间(defaultDelayTime)的两倍。

(2)500ms - 10000ms:

视频帧快了500ms - 10000ms,将delayTime以两倍 defaultDelayValue时间进行延时。

(3)diff > 10000ms

视频帧和音频帧差距很大了,无法通过追赶达到同步,应该将音频缓存队列清空,直接引入最新鲜的音频帧。

相关文章:

  • redis运维(十九)redis 的扩展应用 lua(一)
  • 如何下载OpenJDK及其源码
  • PHP 语法||PHP 变量
  • 睡前随笔记录
  • 含分布式电源的配电网可靠性评估matlab程序
  • Apache配置虚拟主机
  • 【双指针】有效三角形的个数
  • 6.2.SDP协议
  • 数据分析基础之《jupyter notebook工具》
  • OpenCvSharp从入门到实践-(01)认识OpenCvSharp开发环境搭建
  • Modbus TCP
  • SpringBoot问题
  • Django 入门学习总结8-管理页面的生成
  • 【qsort学习及改造冒泡排序能排序任何数】
  • 【数据结构】F : 道路建设 (Ver. I)
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 30秒的PHP代码片段(1)数组 - Array
  • Computed property XXX was assigned to but it has no setter
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • extjs4学习之配置
  • gops —— Go 程序诊断分析工具
  • java取消线程实例
  • Java小白进阶笔记(3)-初级面向对象
  • Linux中的硬链接与软链接
  • maya建模与骨骼动画快速实现人工鱼
  • PV统计优化设计
  • React系列之 Redux 架构模式
  • Redis学习笔记 - pipline(流水线、管道)
  • 多线程 start 和 run 方法到底有什么区别?
  • 工作手记之html2canvas使用概述
  • 回流、重绘及其优化
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 通过几道题目学习二叉搜索树
  • 云大使推广中的常见热门问题
  • 在Mac OS X上安装 Ruby运行环境
  • mysql面试题分组并合并列
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 移动端高清、多屏适配方案
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #1015 : KMP算法
  • #HarmonyOS:基础语法
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八十八)VFL语言初步 - 实现布局
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (算法)前K大的和
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)(官方)UE4--图像编程----着色器开发