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

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

http://www.lryc.cn/news/240561.html

相关文章:

  • JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系
  • 报错For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
  • whisper使用方法
  • 通过easyexcel实现数据导入功能
  • Springboot_文件下载功能(前端后端)
  • Vue框架学习笔记——v-bind数据单向绑定和v-model数据双向绑定
  • 将对象转成URL参数
  • 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
  • 超级武器!深入LoadRunner性能测试流程及极速分析结果!
  • 解决requests库进行爬虫ip请求时遇到的错误的方法
  • 大语言模型领域的重要术语解释
  • 无需公网IP,使用内网穿透实现公网访问本地OpenWRT管理界面
  • 利用 docker 实现JMeter分布式压测
  • Sentinel 分布式系统
  • Cookie、Session、CBV加装饰器的三种方法
  • 【高级渗透篇】网络安全面试
  • 【Flink】Process Function
  • 【源码分析】zeebe actor模型源码解读
  • python3实现类似expect shell的交互式与SFTP的脚本
  • java游戏制作-飞翔的鸟游戏
  • NodeMCU ESP8266构建Web Server网页端控制设备
  • 搭建区块链
  • Python通过selenium调用IE11浏览器报错解决方法
  • Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂
  • opencv-图像金字塔
  • 字符串匹配算法——KMP
  • 电子学会C/C++编程等级考试2023年03月(一级)真题解析
  • 微信小程序汽车租赁系统
  • docker部署微服务
  • 统计voc格式数据中的xml标签、bndbox到excel表格中