音视频整体解码流程和同步流程

news2024/12/26 19:40:55

目录

    • 1. 整体解码流程
      • 1. 初始化 FFmpeg
      • 2. 打开媒体文件
      • 3. 查找解码器
      • 4. 打开解码器
      • 5. 读取和解码数据
      • 6. 处理解码后的帧
      • 7. 释放资源
    • 2. 音视频同步整体流程
      • 1. 解复用媒体流
      • 2. 解码
      • 3. 以音频为时钟源进行音视频同步的策略
      • 4. 缓冲区设计

现在先说大体流程,不分析代码

1. 整体解码流程

在这里插入图片描述

1. 初始化 FFmpeg

调用 av_register_all() 和 avformat_network_init() 来初始化 FFmpeg 库。

2. 打开媒体文件

使用 avformat_open_input() 打开媒体文件,并读取媒体流信息。
使用 avformat_find_stream_info() 获取流信息,包括音频流和视频流的数量、类型及相关参数。

3. 查找解码器

遍历找到的媒体流,使用 avcodec_find_decoder() 根据流的编码格式查找合适的解码器(如 H.264、AAC 等)。
调用 avcodec_alloc_context3() 分配解码上下文,并设置相应的参数(如采样率、通道数、宽高等)。

4. 打开解码器

使用 avcodec_open2() 打开解码器,并将解码上下文与解码器关联。

5. 读取和解码数据

使用 av_read_frame() 循环读取媒体数据包。
根据读取的数据包类型(音频或视频)将数据传递给相应的解码器。
调用 avcodec_send_packet() 将数据包发送给解码器。
使用 avcodec_receive_frame() 从解码器接收解码后的帧。

6. 处理解码后的帧

根据解码后的帧的类型(音频帧或视频帧),进行后续处理:
音频帧:可以将音频帧写入音频输出设备进行播放,或者进行进一步的处理(如音频效果、混音等)。
视频帧:可以将视频帧渲染到图形窗口,或进行后续处理(如转码、特效等)。

7. 释放资源

在完成解码后,调用 avcodec_free_context() 和 avformat_close_input() 释放分配的解码器上下文和媒体文件资源。

2. 音视频同步整体流程

1. 解复用媒体流

使用解复用器解码媒体流,分离出来的音频数据包和是视频数据包,分别存在各自的包队列中。
并且解复用时给每个数据包设置 DTS(解码时间戳)
DTS是自己算的,通常情况下,你会基于上一个包的 DTS 和当前包的持续时间来计算当前包的 DTS。

2. 解码

使用av_read_frame() 循环读取数据包,根据DTS时间戳的顺序,分别解码读出来的音频包和视频包。
得到音频帧数据和视频帧数据,放入相应的队列中。
使用ffmpeg解码后,每个帧会附带其 PTS。

怎么让音频和视频的PTS对应?
通过时间基转换,让两者可比较。

PTS:
视频帧的 PTS
帧率:视频的帧率(fps)决定了每秒显示多少帧。如果视频以 30 fps 编码,则每帧的显示时间为 1/30 秒。
音频帧的 PTS
采样率:音频的采样率决定了每秒钟采集多少样本。例如,44100 Hz 表示每秒 44100 个样本。

3. 以音频为时钟源进行音视频同步的策略

缓冲与延迟:在实际应用中,可能需要引入一些缓冲机制,以便平滑处理音视频流。这可以通过 FIFO 队列等方式实现。

动态调整:根据网络条件或系统负载,可能需要动态调整音频和视频的同步策略,以保证平滑播放。

错误处理:也要注意对异常情况的处理,比如丢失帧、网络延迟等,以确保程序的健壮性。

4. 缓冲区设计

1.1 音频和视频缓冲区

  • 音频缓冲区:用于存储从音频流读取的数据,确保音频数据在播放时不会因为延迟而中断。通常,音频缓冲区的大小会根据音频的比特率、网络条件和系统性能进行调整。

  • 视频缓冲区:用于存储从视频流读取的帧,以便在合适的时间进行显示。视频缓冲区的大小可以设定为能够覆盖一定数量的帧,以应对音频流的变化。

  1. 动态缓冲管理

2.1 自适应调整

  • 根据实时监测的音视频同步状态(例如,音频播放时间与视频显示时间的差距),动态调整音频和视频缓冲区的大小。例如,当检测到音频延迟时,可以增加视频缓冲区的容量,以保证视频在输出时不会滞后于音频。

2.2 阈值设置

  • 设置阈值来判断何时需要调整缓冲区。例如,如果音频和视频之间的时间差超出设定范围,就进行相应的缓冲调整。
  1. 音频作为时钟源

3.1 时间戳管理

  • 每个音频样本或块都有一个对应的时间戳,系统使用这些时间戳来确定音频的播放进度,并据此决定视频的播放时机。

3.2 视频帧的调度

  • 当从音频缓冲区取出数据进行播放时,系统会检查当前的音频时间戳,根据这一时间戳决定是否从视频缓冲区取出下一帧。如果音频播放的时间戳大于等于视频的时间戳,则播放下一帧视频。
  1. 处理延迟与不同步

4.1 监测与反馈

  • 实时监测音频与视频的同步状态,检测是否存在延迟。一旦发现不同步,可以通过丢弃多余的视频帧或插入静音来进行调整。

4.2 错误修正策略

  • 如果检测到音频过早或视频滞后,可以选择:
    • 增加视频缓冲区的大小。
    • 丢弃已缓存的视频帧,或在必要时添加黑帧或静态图像。

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

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

相关文章

网络原理 - TCP/IP

文章目录 传输层UDP协议TCP协议TCP协议的核心机制确认应答机制超时重传机制连接管理三次握手四次挥手 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题 异常情况 小结 网络层IP协议IP地址不够用的问题一、动态分配IP地址二、 NAT机制(网络地址映射)三、使用IPv6 地…

【HarmonyOS】自定义圆点进度条

【HarmonyOS】实现一个自定义带圆点的进度条效果。 方案就是做一个圆角组件,然后利用rotate旋转,至于动画效果,我查了一下文档,只要设置enableSmoothEffect:false,就可以关闭动画,然后自己开个定时器&#…

如何使用代理IP解决反爬虫问题

在网络爬虫的世界里,反爬虫机制就像是守卫城池的士兵,时刻准备着抵御外来的“入侵者”。为了突破这些守卫,代理IP就像是你的隐形斗篷,帮助你在网络世界中自由穿梭。今天,我们就来聊聊如何使用代理IP解决反爬虫问题。 …

【CMake】一、CMake 介绍

CMake 基础介绍 1. CMake 介绍2. CMake 安装3. 入门样例 - Hello-world 工程 1. CMake 介绍 CMake 是一个开源、跨平台的构建系统,主要用于软件的构建、测试和打包。 CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程,并生成适用于不…

叉车司机信息权限采集系统,保障与优化叉车运输网络的安全

叉车司机信息权限采集系统可以通过监控司机的行车行为和车辆状况,实时掌握车辆位置和行驶路线,从而提高运输安全性,优化运输网络,降低事故风险。同时,该系统还可以通过对叉车司机信息和行车数据的分析,优化…

LM393 电压比较器和典型电路

一、介绍 LM393内部包括有两个独立、高精度电压比较器 组成的集成电路,失调电压低,最大为2.0mV。专为获得宽电压范围、单电源供电而设计,也可以双电源供电。而且无论电源电压大小,电源消耗的电流都很低。即使是单电源供电&#xf…

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall 数据集-目标检测系列-兔子检测数据集 rabbit 数据量:8k 想要进一步了解,请联系。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加…

【重学 MySQL】三十九、Having 的使用

【重学 MySQL】三十九、Having 的使用 基本语法示例示例 1:使用 HAVING 过滤分组示例 2:HAVING 与 WHERE 的结合使用 注意点WHERE 与 HAVING 的对比基本定义与用途主要区别示例对比总结 在 MySQL 中,HAVING 子句主要用于对 GROUP BY 语句产生…

进阶SpringBoot之 Dubbo-admin 安装测试

Dubbo 是一个 jar 包,本身并不是一个服务软件 它能让 Java 程序连接到 Zookeeper,并利用 Zookeeper 消费、提供服务 Dubbo-admin 是一个可视化的监控程序,可以让用户更好的管理监控众多的 Dubbo 服务 GitHub dubbo-admin 在项目目录下打包…

MyBatis<foreach>标签的用法与实践

foreach标签简介 实践 demo1 简单的一个批量更新&#xff0c;这里传入了一个List类型的集合作为参数&#xff0c;拼接到 in 的后面 &#xff0c;来实现一个简单的批量更新 <update id"updateVislxble" parameterType"java.util.List">update model…

代码随想录算法训练营第56天 | 1、冗余连接,2、冗余连接II

目录 1、冗余连接 2、冗余连接II 1、冗余连接 题目描述 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&#xff09;&#xff0c;如图&#xff1a; 现在在…

UNI-SOP应用场景(1)- 纯前端预开发

在平时新项目开发中&#xff0c;前端小伙伴是否有这样的经历&#xff0c;hi&#xff0c;后端小伙伴们&#xff0c;系统啥时候能登录&#xff0c;啥时候能联调了&#xff0c;这是时候往往得到的回答就是&#xff0c;再等等&#xff0c;我们正在搭建系统呢&#xff0c;似曾相识的…

Marp精华总结(一)基础篇

概述 Marp是一个基于MarkDown快速编写幻灯片的工具&#xff0c;其可以基于VScode环境&#xff0c;实现MarkDown幻灯的编写和预览。Marp并不难&#xff0c;但是目前的教程还比较零散&#xff0c;而且很多细节和高级内容并没有完全展示&#xff0c;我自己是很早就体验到了Marp的…

C语言进阶之泛型列表(Generic List)

1.前言 数据结构是需要泛型的,而在C语言中实现泛型就只能去用指针魔法了,来跟我一起实现吧!所有代码经测试未发现明显bug,可放心食用. 2.代码截图展示 1.list.h 2.main.c 3.list.c 3.结语 这次分享的列表采用动态数组的方式实现,下次我会去用链表实现,两种实现方式各有优劣,希…

通信工程学习:什么是VIM虚拟化基础设施管理器

VIM:虚拟化基础设施管理器 VIM(Virtualized Infrastructure Manager)虚拟化基础设施管理器,是一种负责管理和控制虚拟化环境中所有虚拟资源的工具和系统。以下是关于VIM虚拟化基础设施管理器的详细解释: 一、定义与功能 VIM是网络功能虚拟化(NFV)架构中…

DVWA-File Inclusion(文件包含)渗透测试

概念&#xff1a; 漏洞产生原因&#xff1a; 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如&#xff0c;如果一个 Web 应用程序接受用户输入的文件路径&#xff0c;然后使用这个路径进行文件包含&#xff0c;而没有对用户输入进行任何检查&#xff0c…

dll 研究 1

起因&#xff0c; 目的: 就是想看看 dll 里面有什么。 过程: 找到&#xff0c;打开 dumpbin 在开始菜单中搜索 “Developer Command Prompt for VS”打开&#xff0c; 然后输入 dumpbin 查看 a.dll 中 dumpbin /headers a.dll 查看头部信息dumpbin /EXPORTS a.dlldumpbin /a…

基于SSM+小程序的在线课堂微信管理系统(在线课堂1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 &emsp1、管理员实现了首页、个人中心、用户管理、课程分类管理、课程信息管理、课程订阅管理、课程视频管理、公告栏管理、留言板管理、系统管理。 2、用户实现了首页、课程信息、公…

Web3Auth 如何工作?

Web3Auth 用作钱包基础设施&#xff0c;为去中心化应用程序 (dApp) 和区块链钱包提供增强的灵活性和安全性。在本文档中&#xff0c;我们将探索 Web3Auth 的功能&#xff0c;展示它如何为每个用户和应用程序生成唯一的加密密钥提供程序。 高级架构 Web3Auth SDK 完全存在于用…

消息号 FS215 对科目 2221010200 7333允许销项税, J1 不允许

业务场景&#xff1a; 在做发票校验时&#xff0c;报错“消息号 FS215 对科目 2221010200 7333允许销项税, J1 不允许”而且计算税额失效&#xff0c;红灯报错。 初步怀疑是税码配置问题 FTXP J1是进项税&#xff0c;但是这里维护了销项税和均一税&#xff0c;在这里删除是需…