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

【音视频】ffplay解析-音视频同步

音视频同步

主要解析:以音频为基准,让视频合成音频


思路

  • 视频慢了则丢掉部分视频帧(视觉->画⾯跳帧)

  • 视频快了则继续渲染上⼀帧


具体实现

一个国际标准:音频帧-视频帧时间戳的差值在-100ms~25ms内流畅
1.差值=音频播放时间戳-视频播放时间戳----diff=pts_audio-pts_video(注意区分!!)
2.判断逻辑:(无法感知区间:min=-125ms,max=45ms)- max<diff:画后音前,视频落后了,丢帧不渲染(赶进度),直接下一帧- min<diff<max:正常渲染- diff<min:画前音后,视频超前了,持续显示当前帧,视频播放线程先睡会_阻塞:sleep(diff-max)然后继续渲染当前视频帧

ffplay具体源码

 /* if video is slave, we try to correct big delays byduplicating or deleting a frame通过重复帧或者删除帧来纠正延迟*/diff = get_clock(&is->vidclk) - get_master_clock(is);/* skip or repeat frame. We take into account thedelay to compute the threshold. I still don't knowif it is the best guess */sync_threshold = FFMAX(AV_SYNC_THRESHOLD_MIN,FFMIN(AV_SYNC_THRESHOLD_MAX, delay));if (!isnan(diff) && fabs(diff) < is->max_frame_duration) { // diff在最大帧duration内if (diff <= -sync_threshold) {      // 视频已经落后了delay = FFMAX(0, delay + diff); // 上一帧持续的时间往小的方向去调整}else if (diff >= sync_threshold && delay > AV_SYNC_FRAMEDUP_THRESHOLD) {// 视频超前delay = delay + diff; // 上一帧持续时间往大的方向去调整av_log(NULL, AV_LOG_INFO, "video: delay=%0.3f A-V=%f\n",delay, -diff);}else if (diff >= sync_threshold) {// 上一帧持续时间往大的方向去调整delay = 2 * delay; // 保持在 2 * AV_SYNC_FRAMEDUP_THRESHOLD内, 即是2*0.1 = 0.2秒内} else {// 音视频同步精度在 -sync_threshold ~ +sync_threshold// 其他条件就是 delay = delay; 维持原来的delay, 依靠frame_timer+duration和当前时间进行对比}}
http://www.lryc.cn/news/170984.html

相关文章:

  • 虚拟列表 - Vue3实现一个可动态改变高度的虚拟滚动列表
  • PyTorch实战:实现Cifar10彩色图片分类
  • Vue模板语法(下)
  • uniapp掉完接口后刷新当前页面方法
  • linux安装redis超级详细教程
  • 2023-09-20 事业-代号z-个人品牌-数据库内核专家-分析
  • UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版
  • 【运维篇】二、配置文件与多环境控制
  • 【WFA】 VHT-5.2.27 Pre-requisite throughput lower than expected
  • Pytorch史上最全torch全版本离线文件下载地址大全(9月最新)
  • CentOS服务器利用docker搭建中间件命令集合
  • Flask狼书笔记 | 09_图片社交网站 - 长文
  • 【链表】K 个一组翻转链表-力扣 25 题
  • jdk17新特性
  • 爬虫项目(四):抓取网页所有图片
  • 短剧推广和小说推文在哪里授权介绍
  • Java:本地文件通过表单参数接口发送后大小变成0
  • Linux 共享内存
  • druid在springboot中如何整合配置!
  • 数据结构:栈
  • 每日刷题-6
  • systrace使用注意事项
  • RockyLinux9.2 网卡配置和nmcli、nmtui命令的使用
  • Java线程池ThreadPoolExecutor应用(Spring Boot微服务)
  • QT5|C++|通过信号槽机制实现进度条更新
  • 什么是智能推荐?智能推荐的原理是什么?
  • Windows下的Elasticsearch-head安装
  • 两台服务器间进行文件传输
  • 研究生选控制嵌入式还是机器视觉好?
  • SecureCRT SSH与FTP连接中文乱码