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下载:点击跳转

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

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP基础学习笔记(常用函数)

字符串 strlen — 获取字符串长度 <?php $str abcdef; echo strlen($str); // 6$str ab cd ; echo strlen($str); // 7 //strlen() 返回的是字符串的字节数&#xff0c;而不是其中字符的数量。 ?>strpos — 查找字符串首次出现的位置 $mystring abc; $findme …

051、Python 快速把多个元素连接成一个字符串的方法

要想快速地将列表或元组中的元素连接成一个字符串&#xff0c;有一个特别实用地方法&#xff1a;join() 方法。 join() 方法&#xff1a;一个用于将序列中的元素以指定的分隔符连接成一个字符串的方法&#xff0c;这个方法通常用于字符串操作。 基本语法&#xff1a; separa…

在windows操作系统上安装MariaDB

最近收到关于数据库在哪里看的评论&#xff0c;所以就一不做二不休&#xff0c;把安装数据库的步骤写一篇文章吧。 这篇文章介绍如何在windows上完成MariaDB-10.6.5版本的安装&#xff0c;对应MySQL-8.x版本。 第一步&#xff1a;下载安装包 通过以下网盘链接下载MariaDB-10.6…

Spark入门:KMeans聚类算法

聚类&#xff08;Clustering&#xff09; 是机器学习中一类重要的方法。其主要思想使用样本的不同特征属性&#xff0c;根据某一给定的相似度度量方式&#xff08;如欧式距离&#xff09;找到相似的样本&#xff0c;并根据距离将样本划分成不同的组。聚类属于典型的无监督学习&…

国产信创CPU之飞腾CPU剖析

CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU已形成自主架构、x86、ARM三大阵营。自主阵营中&#xff0c;龙芯、申威分别基于MIPS和Alpha推出loong ISA和SW-64。ARM阵营以鲲鹏、飞腾为代表&#xff0c;利用ARM IP授权开发处理器。x86阵营由海光、兆芯等主导&#xff…

【Linux】操作系统中的文件系统管理:磁盘结构、逻辑存储与文件访问机制

文章目录 前言&#xff1a;1. 磁盘机械结构2. 磁盘物理结构3. 磁盘的逻辑存储3. 1. 文件名呢&#xff1f;3.2 对文件的增删查改与 路径3.3. 文件 4. 软硬链接4.1. 操作观察现象4.2. 软硬链接的原理4.3. 软硬链接的应用场景 总结 前言&#xff1a; 在现代操作系统中&#xff0c…

day27-完全平方数(背包问题)

题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 1…

基于人工智能的运输路径规划系统

基于人工智能的运输路径规划系统是现代物流领域中一项重要的技术应用&#xff0c;该系统通过集成先进的人工智能算法和数据分析技术&#xff0c;为运输行业提供了更为高效、准确的路径规划服务。以下是关于该系统的详细介绍&#xff1a; 一、系统概述 基于人工智能的运输路径…

Python基础:在多个.py文件组成的项目中如何安全的使用文件路径(绝对路径安全,相对路径可移植性好,如何选?)

在Python项目中使用相对路径时,路径的计算是基于当前执行脚本的位置,即当前工作目录(Current Working Directory, CWD)。这通常是你从中启动Python解释器的目录。这种方式在简单脚本或当你直接从命令行运行单个脚本文件时行得通,但在较大的项目或多层目录结构中可能导致路…

Flutter 中的 PopupMenuTheme 小部件:全面指南

Flutter 中的 PopupMenuTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建美观、响应式的移动、Web 和桌面应用。Flutter 的 Material 组件库中包含了丰富的 UI 组件&#xff0c;其中 PopupMenuButt…

基于Springboot+vue实现的汽车服务管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

《effective c++》学习笔记一

从今天开始看《effective c》这本书&#xff0c;把学到的东西当做笔记记下来&#xff0c;算是督促自己学习吧&#xff0c;也算是和大家一起分享一点东西&#xff0c;理解不当的地方&#xff0c;请谅解。&#xff08;每天更新三个条款&#xff09;。 条款1&#xff1a;视C为一个…

外贸如何让新客户返单以及转介绍?

要让外贸新客户返单以及转介绍&#xff0c;关键在于提供卓越的服务、建立信任和维护良好的客户关系。以下方法可以借鉴&#xff1a; 1. 提供优质的产品和服务 - 产品质量保证&#xff1a;确保产品质量始终符合或超过客户预期。 - 定制服务&#xff1a;根据客户需求提供个性化…

45.自定义线程池(三)-拒绝策略

拒绝策略采用函数式接口参数传入&#xff0c;策略模式 FunctionalInterface public interface RejectPolicy<T> {void reject(BlockingQueue<T> queue, T task); } package com.xkj.thread.pool;import com.aspose.words.Run; import lombok.extern.slf4j.Slf4j;…

Flutter 中的 ButtonBarTheme 小部件:全面指南

Flutter 中的 ButtonBarTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了丰富的组件来帮助开发者构建高性能、美观的应用。在 Flutter 的 Material 组件库中&#xff0c;ButtonBar 是一个用于展示按钮集合的组件&#xff…

java多线程之synchronized详解

锁的内存语义 锁可以让临界区互斥执行&#xff0c;还可以让释放锁的线程向同一个锁的线程发送消息锁的释放要遵循Happens-before原则&#xff08;锁规则&#xff1a;解锁必然发生在最后的加锁之前&#xff09;锁在java中的具体表现时Synchronized和Lock 复现步骤 通过gradle…

SaaS 电商设计 (十一) 那些高并发电商系统的限流方案设计

目录 一.什么是限流二.怎么做限流呢2.1 有哪些常见的系统限流算法2.1.1 固定窗口2.1.1 滑动窗口2.1.2 令牌桶2.1.3 漏桶算法 2.2 常见的限流方式2.2.1 单机限流&集群限流2.2.2 前置限流&后置限流 2.3 实际落地是怎么做的2.3.1 流量链路2.3.2 各链路限流2.3.2.1 网关层2…

Spring Boot(七十七):SpringBoot实现接口内容协商功能

1 什么是内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格式进行返回,而如果需要一个接口即支持 json,又支持其他格式,开发和维护多套代码显然是不合理的,而 Spring 又恰好提供了该功能,那便是Conten…

重学java 56. Map集合

我们要拥有一定成功的信念 —— 24.6.3 一、双列集合的集合框架 HashMap 1.特点: a.key唯一,value可重复 b.无序 c.无索引 d.线程不安全 e.可以存null键,null值 2.数据结构:哈希表 LinkedHashMap&#xff08;继承HashMap&#xff09; 1.特点: a.key唯一,value可重复 b.有序 c.无…

Spring All系列教程学习下

SpringAll SpringAll对应的博客 java-developer-document - 别人的学习笔记 Spring All系列教程 该仓库为个人博客https://mrbird.cc中Spring系列源码&#xff0c;包含Spring Boot、Spring Boot & Shiro、Spring Cloud&#xff0c;Spring Boot & Spring Security &a…