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

qt+ffmpeg 实现音视频播放(四)之音视频同步

在处理音视频数据时,解码音频的数据往往会比解码视频的数据比较慢,所以我们在播放音视频时,音频和视频的数据会出现渐渐对不上的情况。尤其在播放时间越长的时候,这种对不上的现象越明显。

为了解决这一问题,人们想出了3种方法:

1、音频向视频同步
2、视频向音频同步
3、音频和视频向系统时钟同步

在音视频处理中,每一帧音频或者视频都会有一个与之关联的时间戳,所以向音频或者视频同步,其实就是向它们的时间戳进行同步。

在这3种方法中,人们通常会选择第2种方案,即视频向音频同步,因为人耳对声音的延迟更敏感。本文也是用的这个方案。

它的实现也非常简单。首先就是分别获取当前播放的音频和视频的时间戳,然后计算当前视频与音频的时间差,如果视频比音频快,就根据这个时间差进行相应的延迟;如果视频比音频慢,就丢弃当前帧:

qreal vs = frame->pts * av_q2d(videoStream->time_base);//+ frame->pkt_duration * av_q2d(videoStream->time_base);
qreal as = AudioThread::get()->getTime();
double diff_time = vs - as;//计算视频显示时间与音频播放时间之间的差值
if (diff_time > 0)
{double fps_delay = 1.0 / fps;//计算每帧的延迟,通过将 1.0 除以帧率(fps)来得到double real_delay = fps_delay;av_usleep((diff_time + real_delay) * 1000 * 1000);
}
else
{//audio fasterif (fabs(diff_time) >= 0.05){qDebug() << "unref";//丢帧av_frame_unref(frame);msleep(1);}
}

demo下载:点击跳转

觉得有帮助的话,打赏一下呗。。

           

相关文章:

  • k8s——Pod进阶(资源限制和探针)
  • 解决 Git commit 或 Git merge 跑到 VIM 里面去了
  • C#中的数组探索
  • C#面:.Net中会存在内存泄漏吗,请简单描述
  • python数据库操作
  • 校园导航系统C++
  • ReDos攻击浅析
  • 【揭秘】如何借助聚道云软件连接器,实现差旅管理新飞跃!
  • 神器!!Python热重载调试【送源码】
  • 【康耐视国产案例】智能AI相机机器视觉精准快速实现包裹标签的智能粘贴
  • 问题排查|记录一次基于mymuduo库开发的服务器错误排查(段错误--Segmentation fault (core dumped))
  • 虚拟现实环境下的远程教育和智能评估系统(一)
  • 头歌数据结构与算法课程设计中-硬币找零
  • vue项目中markdown显示为html
  • MatLab命令行常用命令记录
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [笔记] php常见简单功能及函数
  • create-react-app项目添加less配置
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • mongo索引构建
  • nodejs实现webservice问题总结
  • Python爬虫--- 1.3 BS4库的解析器
  • Ruby 2.x 源代码分析:扩展 概述
  • Service Worker
  • spark本地环境的搭建到运行第一个spark程序
  • webpack+react项目初体验——记录我的webpack环境配置
  • 解析带emoji和链接的聊天系统消息
  • 数组的操作
  • 通过npm或yarn自动生成vue组件
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #Ubuntu(修改root信息)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (26)4.7 字符函数和字符串函数
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)Elastix图像配准:3D图像
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (力扣)循环队列的实现与详解(C语言)
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四)stm32之通信协议
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET 8 跨平台高性能边缘采集网关
  • .Net Core 微服务之Consul(二)-集群搭建
  • .NET IoC 容器(三)Autofac
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • @Autowired和@Resource装配
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...