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

上图介绍:
- 该图是以音频的时间为基,对视频播放时间的延迟控制方案,只调整视频的播放延时。
- 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
视频帧和音频帧差距很大了,无法通过追赶达到同步,应该将音频缓存队列清空,直接引入最新鲜的音频帧。
相关文章:
音视频同步笔记 - 以音频时间为基
音视频同步 - 以音频时间为基 上图介绍: 该图是以音频的时间为基,对视频播放时间的延迟控制方案,只调整视频的播放延时。delayTime是视频播放的延迟时间,初始值是1 / FPS * 1000 (ms),如果FPS为25帧率,初始…...
JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系
JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系 JavaScript 的原始(primitive)数据类型包括包括数字(Number)、字符串(String)、布尔值(Boolean…...
报错For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
.报错For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 报错信息如下: ./aten/…...
whisper使用方法
看这个 github https://github.com/Purfview/whisper-standalone-win/tags下载 视频提取音频 ffmpeg -i 222.mp4 -vn -b:a 128k -c:a mp3 output.mp3截取4秒后的音频 ffmpeg -i output.mp3 -ss 4 -c copy output2.mp3使用 whisper-faster.exe 生成字幕 whisper-faster.exe …...
通过easyexcel实现数据导入功能
上一篇文章通过easyexcel导出数据到excel表格已经实现了简单的数据导出功能,这篇文章也介绍一下怎么通过easyexcel从excel表格中导入数据。 目录 一、前端代码 index.html index.js 二、后端代码 controller service SongServiceImpl 三、功能预览 四、后端…...
Springboot_文件下载功能(前端后端)
遇到的问题: 文件下载后文件一直被破坏,无法正常打开文件名乱码,如图 刚开始一直在纠结,是不是后端没有写对,然后导致下载不能使用 后来搜索了一些资料,发现后端没什么问题 然后就开始找到其他项目对比…...
Vue框架学习笔记——v-bind数据单向绑定和v-model数据双向绑定
文章目录 v-bind,数据单向绑定简写形态(省略v-bind,只留冒号)示例一(将输入框数据改为:哈哈哈哈哈):实例二(将Vue实例中的name改为字符串:"单向绑定&quo…...
将对象转成URL参数
背景 有的时候前端跳转到其他平台的页面需要携带额外的参数,需要将对象转成用 & 连接的字符串拼接在路径后面。 实现方法...
【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
超级武器!深入LoadRunner性能测试流程及极速分析结果!
性能测试目的 1 什么是性能测试? 性能测试是通过性能的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能࿰…...
解决requests库进行爬虫ip请求时遇到的错误的方法
目录 一、超时错误 二、连接错误 三、拒绝服务错误 四、内容编码错误 五、HTTP错误 在利用requests库进行网络爬虫的IP请求时,我们可能会遇到各种错误,如超时、连接错误、拒绝服务等等。这些错误通常是由目标网站的限制、网络问题或我们的爬虫代码中…...
大语言模型领域的重要术语解释
前言 本人对人工智能非常感兴趣,目前是一名初学者,在研究大语言模型的一些内容。很多模型都是用英文提出的,其中也包括很多概念,有些概念的中文翻译和其想表达的意思不完全一样,所以在这里,想更加精准地帮…...
无需公网IP,使用内网穿透实现公网访问本地OpenWRT管理界面
文章目录 1.openWRT安装cpolar2.配置远程访问地址3.固定公网地址 简单几步实现在公网环境下远程访问openWRT web 管理界面,使用cpolar内网穿透创建安全隧道映射openWRT web 界面面板443端口,无需公网IP,无需设置路由器。 1.openWRT安装cpola…...
利用 docker 实现JMeter分布式压测
为什么需要分布式? 在工作中经常需要对一些关键接口做高QPS的压测,JMeter是由Java 语言开发,没创建一个线程(虚拟用户),JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…...
Sentinel 分布式系统
Sentinel 是一种分布式系统的流量防卫兵和熔断器,由阿里巴巴开发并开源。它的主要目标是保护分布式系统中的稳定性和可用性,防止因高并发或异常流量而导致的系统崩溃。下面是 Sentinel 的原理和使用教程的概要: Sentinel 的原理:…...
Cookie、Session、CBV加装饰器的三种方法
【0】cookie、session和Token的发展史 【1】Cookie的形式 存储形式:k:v键值对存储位置:客户端缺点:不安全,信息可能会泄露 【2】session的形式 标识符,表示我是当前用户加密出来的数据对敏感信息进行加密…...
【高级渗透篇】网络安全面试
【高级渗透篇】网络安全面试 1.权限维持2.代码安全Python语法相关 1.权限维持 Linux权限维持方法论 Windows权限维持方法论 2.代码安全 Python 语法相关 1、Python的值类型和引用类型是哪些 Python 中的值类型包括: 数字类型(如整数、浮点数、复数…...
【Flink】Process Function
目录 1、ProcessFunction解析 1.1 抽象方法.processElement() 1.2 非抽象方法.onTimer() 2、Flink中8个不同的处理函数 2.1 ProcessFunction 2.2 KeyedProcessFunction 2.3 ProcessWindowFunction 2.4 ProcessAllWindowFunction 2.5 CoProcessFunction 2.6 ProcessJo…...
【源码分析】zeebe actor模型源码解读
zeebe actor 模型🙋♂️ 如果有阅读过zeebe 源码的朋友一定能够经常看到actor.run() 之类的语法,那么这篇文章就围绕actor.run 方法,说说zeebe actor 的模型。 环境⛅ zeebe release-8.1.14 actor.run() 是怎么开始的🌈 Lon…...
python3实现类似expect shell的交互式与SFTP的脚本
前面写过一篇关于python实现类似expect shell的交互式能力的文章,现在补全一下加上sftp的能力脚本。 例子在代码中__example()方法。 依赖paramiko库,所以需要执行pip install paramiko来安装。 import os import queue import re import threading im…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
