当前位置: 首页 > 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

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

相关文章:

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

音视频同步 - 以音频时间为基 上图介绍&#xff1a; 该图是以音频的时间为基&#xff0c;对视频播放时间的延迟控制方案&#xff0c;只调整视频的播放延时。delayTime是视频播放的延迟时间&#xff0c;初始值是1 / FPS * 1000 (ms)&#xff0c;如果FPS为25帧率&#xff0c;初始…...

JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系

JavaScript 原始数据类型和对应的对象类型&#xff08;内置对象&#xff09;之间的关系 JavaScript 的原始&#xff08;primitive&#xff09;数据类型包括包括数字&#xff08;Number&#xff09;、字符串&#xff08;String&#xff09;、布尔值&#xff08;Boolean&#xf…...

报错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. 报错信息如下&#xff1a; ./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表格已经实现了简单的数据导出功能&#xff0c;这篇文章也介绍一下怎么通过easyexcel从excel表格中导入数据。 目录 一、前端代码 index.html index.js 二、后端代码 controller service SongServiceImpl 三、功能预览 四、后端…...

Springboot_文件下载功能(前端后端)

遇到的问题&#xff1a; 文件下载后文件一直被破坏&#xff0c;无法正常打开文件名乱码&#xff0c;如图 刚开始一直在纠结&#xff0c;是不是后端没有写对&#xff0c;然后导致下载不能使用 后来搜索了一些资料&#xff0c;发现后端没什么问题 然后就开始找到其他项目对比…...

Vue框架学习笔记——v-bind数据单向绑定和v-model数据双向绑定

文章目录 v-bind&#xff0c;数据单向绑定简写形态&#xff08;省略v-bind&#xff0c;只留冒号&#xff09;示例一&#xff08;将输入框数据改为&#xff1a;哈哈哈哈哈&#xff09;&#xff1a;实例二&#xff08;将Vue实例中的name改为字符串&#xff1a;"单向绑定&quo…...

将对象转成URL参数

背景 有的时候前端跳转到其他平台的页面需要携带额外的参数&#xff0c;需要将对象转成用 & 连接的字符串拼接在路径后面。 实现方法...

【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

超级武器!深入LoadRunner性能测试流程及极速分析结果!

性能测试目的 1 什么是性能测试? 性能测试是通过性能的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。通过负载测试&#xff0c;确定在各种工作负载下系统的性能&#xff0…...

解决requests库进行爬虫ip请求时遇到的错误的方法

目录 一、超时错误 二、连接错误 三、拒绝服务错误 四、内容编码错误 五、HTTP错误 在利用requests库进行网络爬虫的IP请求时&#xff0c;我们可能会遇到各种错误&#xff0c;如超时、连接错误、拒绝服务等等。这些错误通常是由目标网站的限制、网络问题或我们的爬虫代码中…...

大语言模型领域的重要术语解释

前言 本人对人工智能非常感兴趣&#xff0c;目前是一名初学者&#xff0c;在研究大语言模型的一些内容。很多模型都是用英文提出的&#xff0c;其中也包括很多概念&#xff0c;有些概念的中文翻译和其想表达的意思不完全一样&#xff0c;所以在这里&#xff0c;想更加精准地帮…...

无需公网IP,使用内网穿透实现公网访问本地OpenWRT管理界面

文章目录 1.openWRT安装cpolar2.配置远程访问地址3.固定公网地址 简单几步实现在公网环境下远程访问openWRT web 管理界面&#xff0c;使用cpolar内网穿透创建安全隧道映射openWRT web 界面面板443端口&#xff0c;无需公网IP&#xff0c;无需设置路由器。 1.openWRT安装cpola…...

利用 docker 实现JMeter分布式压测

为什么需要分布式&#xff1f; 在工作中经常需要对一些关键接口做高QPS的压测&#xff0c;JMeter是由Java 语言开发&#xff0c;没创建一个线程&#xff08;虚拟用户&#xff09;&#xff0c;JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…...

Sentinel 分布式系统

Sentinel 是一种分布式系统的流量防卫兵和熔断器&#xff0c;由阿里巴巴开发并开源。它的主要目标是保护分布式系统中的稳定性和可用性&#xff0c;防止因高并发或异常流量而导致的系统崩溃。下面是 Sentinel 的原理和使用教程的概要&#xff1a; Sentinel 的原理&#xff1a;…...

Cookie、Session、CBV加装饰器的三种方法

【0】cookie、session和Token的发展史 【1】Cookie的形式 存储形式&#xff1a;k&#xff1a;v键值对存储位置&#xff1a;客户端缺点&#xff1a;不安全&#xff0c;信息可能会泄露 【2】session的形式 标识符&#xff0c;表示我是当前用户加密出来的数据对敏感信息进行加密…...

【高级渗透篇】网络安全面试

【高级渗透篇】网络安全面试 1.权限维持2.代码安全Python语法相关 1.权限维持 Linux权限维持方法论 Windows权限维持方法论 2.代码安全 Python 语法相关 1、Python的值类型和引用类型是哪些 Python 中的值类型包括&#xff1a; 数字类型&#xff08;如整数、浮点数、复数…...

【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 模型&#x1f64b;‍♂️ 如果有阅读过zeebe 源码的朋友一定能够经常看到actor.run() 之类的语法&#xff0c;那么这篇文章就围绕actor.run 方法&#xff0c;说说zeebe actor 的模型。 环境⛅ zeebe release-8.1.14 actor.run() 是怎么开始的&#x1f308; Lon…...

python3实现类似expect shell的交互式与SFTP的脚本

前面写过一篇关于python实现类似expect shell的交互式能力的文章&#xff0c;现在补全一下加上sftp的能力脚本。 例子在代码中__example()方法。 依赖paramiko库&#xff0c;所以需要执行pip install paramiko来安装。 import os import queue import re import threading im…...

文本数据净化与脱敏实战:构建安全高效的数据预处理流水线

1. 项目概述与核心价值最近在整理个人知识库和开源项目时&#xff0c;发现一个非常普遍但棘手的问题&#xff1a;如何安全、高效地处理来自不同渠道的文本数据&#xff0c;特别是那些可能包含用户隐私、敏感信息或格式混乱的内容。无论是从网页爬取的数据、用户提交的表单&…...

视频生成模型技术解析与NeMo框架实践

1. 视频生成模型的行业变革与挑战过去一年里&#xff0c;视频生成技术正在经历从实验室研究到产业应用的跨越式发展。作为从业者&#xff0c;我亲眼见证了这项技术如何从简单的视频插帧发展到能够生成连贯的分钟级视频内容。在机器人训练、自动驾驶仿真和影视预制作等领域&…...

Golang怎么实现日志记录_Golang如何用zap或logrus搭建结构化日志系统【实战】

zap.NewProduction() 默认不输出Debug日志且以JSON格式输出到os.Stderr&#xff0c;无颜色和换行&#xff0c;易被误判为无输出&#xff1b;调试应改用zap.NewDevelopment()或显式设置日志等级。zap.NewProduction() 为什么打不出日志到控制台&#xff1f;默认不输出——zap.Ne…...

达梦DM8 JDBC连接串配置避坑指南:从单机到集群,这些参数你配对了吗?

达梦DM8 JDBC连接串深度优化实战&#xff1a;高并发场景下的参数配置艺术 当Java应用与达梦DM8数据库相遇时&#xff0c;连接串配置这个看似简单的环节往往成为系统稳定性的"阿喀琉斯之踵"。我曾亲眼目睹一个日活百万的金融系统因switchInterval参数误配导致集群切换…...

面试官直播拷打我:“是否了解Harness Engineering?”,我笑了:“LLM很强,但如果不能拴住、监测、约束,都白搭”。面试官一直在点头。

Harness Engineering 是什么&#xff1f;从哪冒出来的&#xff1f; 面试官一般这么问&#xff1a;"你听说过 Harness Engineering 吗&#xff1f;“或者"Agent Model Harness&#xff0c;你怎么理解这个等式&#xff1f;” 先搞清楚&#xff1a;Harness 是什么&am…...

RK3399开发板开机动画进阶:从bootanimation.zip制作到动态更新Logo分区全解析

RK3399开发板开机动画进阶&#xff1a;从bootanimation.zip制作到动态更新Logo分区全解析 当RK3399开发板启动时&#xff0c;用户首先看到的是开机Logo&#xff0c;紧接着是动态的开机动画。这两个元素不仅是设备启动过程中的视觉呈现&#xff0c;更是品牌展示和用户体验的重要…...

QT 5.15在Windows上死活装不上?别急,试试这个被忽略的‘Archive’按钮(附清华源加速)

QT 5.15安装难题破解&#xff1a;揭秘Windows下被隐藏的版本入口 最近在Windows上安装QT 5.15时&#xff0c;不少开发者遇到了一个令人抓狂的问题——明明官方文档写着支持这个版本&#xff0c;但在线安装器里却怎么也找不到。这就像去餐厅点菜&#xff0c;菜单上明明有你想要的…...

深入TI毫米波SDK:从IWR6843AOP的Demo工程看数据流与LVDS高速传输配置

深入解析TI毫米波雷达SDK&#xff1a;IWR6843AOP的LVDS高速数据传输实战 毫米波雷达技术正在工业自动化、智能交通和消费电子领域掀起一场感知革命。德州仪器&#xff08;TI&#xff09;的IWR6843AOP作为集成DSP和雷达前端的单芯片解决方案&#xff0c;其开箱即用的Demo工程为开…...

10分钟学会在Windows上搭建专业级RTMP流媒体服务器

10分钟学会在Windows上搭建专业级RTMP流媒体服务器 【免费下载链接】nginx-rtmp-win32 Nginx-rtmp-module Windows builds. 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-rtmp-win32 你是否想过在Windows电脑上搭建自己的直播服务器&#xff1f;今天我们要介绍的…...

如何永久保存微信聊天记录?WeChatMsg免费开源工具完整指南

如何永久保存微信聊天记录&#xff1f;WeChatMsg免费开源工具完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...