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

2023/12/5 6:12:13

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

在这里插入图片描述

上图介绍:

  • 该图是以音频的时间为基,对视频播放时间的延迟控制方案,只调整视频的播放延时。
  • 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

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


http://www.jnnr.cn/a/1081954.html

相关文章

Linux进程通信——IPC、管道、FIFO的引入

进程间的通信——IPC 进程间通信 (IPC&#xff0c;InterProcess Communication) 是指在不同进程之间传播或交换信息。 IPC的方式通常有管道 (包括无名管道和命名管道) 、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 …

原理Redis-ZipList

ZipList 1) ZipList的组成2) ZipList的连锁更新问题3) 总结 1) ZipList的组成 ZipList 是一种特殊的“双端链表” &#xff0c;由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。 ZipListEntry: ZipList 中的Entry并不像…

python -opencv 边缘检测

python -opencv 边缘检测 边缘检测步骤: 第一步&#xff1a;读取图像为灰度图 第二步&#xff1a;进行二值化处理 第三步&#xff1a;使用cv2.findContours对二值化图像提取轮廓 第三步&#xff1a;将轮廓绘制到图中 代码如下&#xff1a; from ctypes.wintypes import SIZ…

几个强力的nodejs库

几个强力的nodejs库 nodejs被视为许多Web开发人员的理想运行时环境。 nodejs的设计是为了在运行时中使用JavaScript编写的代码&#xff0c;它是世界上最流行的编程语言之一&#xff0c;并允许广泛的开发者社区构建服务器端应用程序。 nodejs提供了通过JavaScript库重用代码的…

C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7)

C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7) 前面分析了身体的方向,在这里继续QuantizeFacingsFromSequence属性,这个属性就是通过序列定义文件里获取身体的方向。 根据前面分析可知,同样有一个信息类QuantizeFacingsFromSequenceInfo: [Desc("Deriv…

【2023云栖】陈守元:阿里云开源大数据产品年度发布

本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;陈守元 | 阿里云计算平台事业部开源大数据产品总监 演讲主题&#xff1a;阿里云开源大数据产品年度发布 随着云计算的不断发展&#xff0c;未来数据处理和应用的趋势将围绕C…

基于安卓android微信小程序的好物分享系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

Springboot+vue的机动车号牌管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的机动车号牌管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的机动车号牌管理系统&#xff0c;采用M&#xff08;model&#xff09…

LeetCode977.有序数组的平方(双指针法、暴力法、列表推导式)

LeetCode977.有序数组的平方 1.问题描述2.解题思路3.代码4.知识点 1.问题描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] …

Node.js之TCP(net)

Hi I’m Shendi Node.js之TCP&#xff08;net&#xff09; 最近使用Nodejs编写程序&#xff0c;需要用到自己编写的分布式工具&#xff0c;于是需要将Java版的用NodeJs重新写一遍&#xff0c;需要使用到TCP通信&#xff0c;于是在这里记录下Node.js TCP 的使用方法 依赖 需要使…

在UOS系统中编译CEF源码

一、下载cef代码 git clone gitbitbucket.org:chromiumembedded/cef.git 二、执行自动下载代码 由于chromium的代码很大&#xff0c;至少需要准备大概80G的硬盘&#xff01;&#xff01;&#xff01;整个代码量太大还是多准备一些空间吧&#xff08;强烈建议使用固态硬盘保存否…

指针变量和地址

A.指针变量和地址 理解了内存和地址的关系&#xff0c;我们再回到C语⾔&#xff0c;在C语⾔中创建变量其实就是向内存申请空间&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ⽐如&#xff0c;上述的代码就是创建了整型变量a&…

你好,我叫Python,欢迎你认识派森。(来自关于Python语言的全方位自我介绍。

文章目录 自我简介一、Python的发展历程二、Python的特色1.语言特色2.语法特色 三、Python2与Python3的比较1.print 函数2.Unicode3.除法运算4.异常5.八进制字面量表示6.不等运算符7.python 3.0严格使用tab键进行缩进 四、Python适用开发场景及成果1.应用领域2.Python开发出的应…

特效!视频里的特效在哪制作——Adobe After Effects

今天&#xff0c;我们来谈谈一款在Adobe系列中推出的一款图形视频处理软件&#xff0c;适用于从事设计和视频特技的机构&#xff0c;包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室的属于层类型后期软件——Adobe After Effects。 Adobe After Effects&#xf…

OTP语音芯片 NV080D在智能空气检测仪的应用

随着人们对健康和环保的关注度不断提高&#xff0c;人们对看不见的家居环境也越来越重视。智能空气检测仪的市场需求也在不断增长中&#xff0c;呈现稳中向好的趋势。智能空气检测仪能够检测室内空气中的PM2.5、甲醛、TVOC等有害物质&#xff0c;同时还可以检测温湿度、空气质量…

通过easyexcel实现数据导入功能

上一篇文章通过easyexcel导出数据到excel表格已经实现了简单的数据导出功能&#xff0c;这篇文章也介绍一下怎么通过easyexcel从excel表格中导入数据。 目录 一、前端代码 index.html index.js 二、后端代码 controller service SongServiceImpl 三、功能预览 四、后端…

企业实现员工聊天和转账行为的实时监管

如何解决企业营销团队的管理问题&#xff1f; 在当今竞争激烈的市场环境中&#xff0c;企业营销团队的管理显得尤为重要。营销团队是企业发展的重要支柱&#xff0c;然而&#xff0c;一些常见的问题如员工飞单、私单、辱骂删除客户、离职带走公司客户以及工作不认真、工作量无…

FileNotFoundError: Could not find module ‘XXX\lib\site-packages\llvmlite

https://aka.ms/vs/17/release/vc_redist.x64.exe 解决方法:安装c环境 FileNotFoundError: Could not find module xxx\workenv\lib\site-packages\llvmlite\binding\llvmlite.dll (or one of its dependencies). Try using the full path with constructor syntax. 装了个新…

【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

文章目录 一、算法原理二、例题2.1 最大子数组和2.2 环形子数组的最大和 一、算法原理 Kadanes算法是一种用于解决最大子数组和问题的动态规划算法。这类问题的目标是在给定整数数组中找到一个连续的子数组&#xff0c;使其元素之和最大&#xff08;数组含有负数&#xff09;。…

软件测试:测试分类

一. 按照测试对象划分 1.1 界面测试 界面测试(简称UI测试),按照界面的需求(UI设计稿)和界面的设计规则,对我们软件界面所展示的全部内容进行测试和检查,一般包括如下内容: • 验证界面内容的完整性,一致性,准确性,友好性,兼容性.比如页面内容对屏幕大小的自适应,换行,内容是否…
最新文章