【超级干货】播放器核心知识点-音视频同步原理深入剖析

news2024/10/5 20:23:24

引言

本文是自己学习利用ffmpeg实现音视频同步播放的总结文档,参考了网上一些博客,同时调试ffplay源码进行理解,站在巨人的肩膀上学习,感谢开源和分享精神。文中粘贴的代码每行都有注释,确保读者能理解所涉函数的每一行代码的意义。

章节

因为ffplay源码阅读起来比较复杂,因此在下面的内容中,我们尽量抓主要矛盾,忽略不太重要的内容。但还是因为音视频同步机制本身就比较复杂,所以最好还是拆成不同的部分讲述,这样看起来也比较清晰。

一、 整体框架和线程模型

ffplay3.4之后运行的线程模型有了一些变化,在3.4之前是依赖SDL_Timer实现视频帧渲染的触发和循环。在3.4版本便不再依赖SDL_Timer,而是使用while循环+改变sleep时间实现视频帧的渲染循环。在2.4之前是在SDL的audio_callback中进行音频解码。在(包含)2.4之后是单独的音频解码线程。不过这些改动区别不大不影响理解音视频同步机制。

本文分析使用的是SDL_Timer来协助触发视频渲染循环,在SDL的audio_callback回调线程中进行音频解码。

下图便是本文代码的运行模型。
关注公众号:QTShared,免费文章,免费获取源码。

二、SDL音频播放机制

SDL播放声音主要是3个API,下面分别讲一下这几个API:
1. SDL_Init(SDL_INIT_AUDIO)</

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

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

相关文章

TripoSR:开源3D重建模型,0.5秒就能完成2D到3D图转换

TripoSR是由Tripo AI和Stability AI合作开发的最先进的开源模型&#xff0c;用于从单个图像中快速前馈3D重建。在NVIDIA A100 GPU上不到0.5秒就能生成高质量的3D模型。 项目链接 https://github.com/VAST-AI-Research/TripoSR TripoSR利用大型重建模型(LRM)的原理&#xff0c;…

恒峰便携式森林灭火泵:森林守护者的强力助手

在茂密的森林中&#xff0c;一场突如其来的火灾可能会带来无法估量的破坏。这不仅会对生态环境造成严重影响&#xff0c;还可能危及人类和动植物的生命安全。为了应对这种突发情况&#xff0c;恒峰研发出了一种便携式森林灭火泵&#xff0c;它成为森林守护者的强力助手。 首先&…

32个关键字详解①(C语言)

目录 关键字分类&#xff1a; 第一个C程序 - 补充内容 变量的定义与声明 - 补充内容 变量的分类 - 补充内容 变量的作用域 - 补充内容 变量的生命周期 - 补充内容 auto 关键字 register 关键字 static 关键字 static 修饰变量&#xff1a; static修饰函数 sizeof 关键字 基本数…

解决windows无法识别外接显示器问题

文章目录 1. 问题2. 解决方法2.1 先尝试重启2.2 检查设备驱动 1. 问题 windows 系统在接入其他显示器时&#xff0c;发现另一个显示器没有生效 2. 解决方法 2.1 先尝试重启 首先你应该至少先尝试重启一次电脑&#xff0c;万能的重启方法&#xff01; 2.2 检查设备驱动 如…

hadoop报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法

参考&#xff1a;https://blog.csdn.net/weixin_45735242/article/details/120579387 解决方法 1.下载apache-hadoop-3.1.0-winutils-master 官网下载地址&#xff1a; https://github.com/s911415/apache-hadoop-3.1.0-winutils win配置系统环境&#xff1a; 然后重启idea…

【Python从入门到进阶】50、当当网Scrapy项目实战(三)

接上篇《49、当当网Scrapy项目实战&#xff08;二&#xff09;》 上一篇我们讲解了的Spider与item之间的关系&#xff0c;以及如何使用item&#xff0c;以及使用pipelines管道进行数据下载的操作&#xff0c;本篇我们来讲解Scrapy的多页面下载如何实现。 一、多页面下载原理分…

Git LFS【部署 01】Linux环境安装git-lfs及测试

Linux系统安装git-lfs及测试 1.下载2.安装3.测试4.总结 Git LFS&#xff08;Large File Storage&#xff09;是一个用于Git版本控制系统的扩展&#xff0c;它专门用来管理大型文件&#xff0c;如图像、音频和视频文件。 1.下载 安装包下载页面&#xff1a;https://github.com/…

数据结构入门篇 之 【单链表】的实现讲解(附单链表的完整实现代码以及用单链表完成通讯录的实现代码)

虽然封面是顶针&#xff0c;但是我们还是要好好学习❀ 一.单链表 1.单链表的概念 2.单链表的结构 3.单链表的实现 1&#xff09;.尾插函数 SLTPushBack 2&#xff09;.打印函数 SLPrint 3&#xff09;. 头插函数 SLTPushFront 4&#xff09;.尾删函数 SLTPopBack 5&am…

[云原生] k8s配置资源管理

一、Secret的资源配置 1.1 Secret配置的相关说明 Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 Secret 有…

ARM TrustZone技术解析:构建嵌入式系统的安全扩展基石

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-dSk2aQ85ZR0zxnyI {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

STM32利用标准库的方式输出PWM(proteus仿真)

首先打开proteus仿真软件&#xff0c;绘制电路图&#xff1a; 其中示波器的添加很简单的&#xff0c;看图&#xff1a; 再来看看咱们最后程序的效果&#xff1a; 下面就是程序代码了&#xff0c;新建两个文件PWM.c和PWM.h文件&#xff0c;所属关系如图&#xff1a; 整个的编程思…

【Leetcode每日一题】 位运算 - 位1的个数(难度⭐)(32)

1. 题目解析 题目链接&#xff1a;191. 位1的个数 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给32位二进制数1的个数返回即可。 2.算法原理 位运算特性&#xff1a;通过位运算&#xff0c;特别是按位与(&…

YOLO算法改进Backbone系列之:FocalNet

摘要&#xff1a;本文提出焦调制网络(FocalNets)&#xff0c;其中自注意(SA)完全被焦调制模块取代&#xff0c;用于建模视觉中的令牌交互。焦点调制包括三个组成部分&#xff1a;&#xff08;1&#xff09;焦点上下文化&#xff0c;使用深度卷积层堆栈实现&#xff0c;从短范围…

【MATLAB第99期】#源码分享 | 基于MATLAB的SHEPard模型多输入单输出回归预测模型

【MATLAB第99期】#源码分享 | 基于MATLAB的SHEPard模型多输入单输出回归预测模型 Shepard模型(简称SP模型)就是一种直观的、可操作的相似预测法&#xff0c;常用于插值。相似预测法基本原理按照相似原因产生相似结果的原则&#xff0c;从历史样本中集中找出与现在的最相似的一…

SpringCloud使用

一 、SpringCloud项目简介 SpringCloud项目可划为三个角色&#xff0c;一个是服务的注册与发现中心&#xff08;Eureka &#xff09;&#xff0c;一个是服务的提供方&#xff08;Provider&#xff09;&#xff0c;最后一个是服务的消费方&#xff08;Consumer&#xff09;&…

C语言内存管理-堆内存

堆内存&#xff08;heap&#xff09;又被称为动态内存、自由内存&#xff0c;简称堆。堆是唯一可被开发者自定义的区段&#xff0c;开发者可以根据需要申请内存的大小、决定使用的时间长短等。但又由于这是一块系统“飞地”&#xff0c;所有的细节均由开发者自己把握&#xff0…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)离线部署

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28&#xff08;最新版&#xff09;SDK离线部署 测试资源4.18 以及之前版本4.19 以及之后版本 接触一段时间 ArcGIS JSAPI 之后&#xff0c;整体感觉还好&#xff0c;后来需要解决不同版本问题&#xff0…

学习Java的第六天

目录 一、变量 1、变量的定义 2、变量的声明格式 3、变量的注意事项 4、变量的作用域 二、常量 三、命名规范 Java 语言支持如下运算符&#xff1a; 1、算术运算符 解析图&#xff1a; 示例&#xff1a; 2、赋值运算符 解析图&#xff1a; 示例&#xff1a; 3、关…

若依项目部署之后页面无法展示,一直在加载的解决办法

解决办法 1. srore/modules/permission.js export const loadView (view) > {if (process.env.NODE_ENV "development") {return (resolve) > require([/views/${view}], resolve);} else {// return () > import(/views/${view});return (resolve) >…

如何从碎屏的华为手机恢复数据?6 种热门方法

“只是想知道是否可以从屏幕损坏的华为恢复数据&#xff1f;我尝试将其插入我的笔记本电脑&#xff0c;但手机不允许我进入&#xff0c;因为它要求我更改手机中的设置等.我最好的选择是什么&#xff1f; 当发生事故&#xff0c;我们的华为手机屏幕损坏时&#xff0c;访问这些关…