【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装播放流程 )

2023-08-15 22:24:54


本篇文件主要分析 音视频文件 是怎么产生的 , 以及 音视频文件是如何播放的 ;





一、视频采集处理流程



视频文件从录像到生成文件的全过程 :

采集图像帧 : 摄像头 硬件 负责 采集画面 , 采集的 初始画面 称为 " 图像帧 " , 一秒钟 采集 的 图像帧 数量 称为 " 帧率 " , 如 : 60 帧 就是 一秒钟采集 60 个画面的 图像帧 ;

  • 采样时需要一个 同步时钟信息 , 记录当前采样的时间 , 这是复用和解复用时进行时钟同步的重要依据 ;
  • 每帧图像帧数据都要打上一个时间戳 ;
  • 图像帧 和 音频采样帧 使用的是 相同的时钟源 , 这样借助该时钟可以进行 音视频同步 操作 ;

图像处理 : 如果想要 对视频画面进行修改 , 如 : 添加滤镜 , 调亮画面 , 增加字幕等 , 可以针对 " 图像帧 " 进行修改 , 修改的过程就是 " 图像处理 " ;

图像帧队列 : 将 处理完毕 的 图像帧 , 放到一个 " 图像帧队列 ( Frame Queue ) " 中 , 等待 视频编码 ;

视频编码 : 在 图像帧队列 ( Frame Queue ) 中的视频画面 , 体积非常大 , 1 分钟可能达到 1GB 大小 , 视频的画面必须要进行 压缩编码 ;

视频包队列 : 将 图像帧 编码 后 , 放到 视频包 中 , 然后 将若干 视频包 放到 " 视频包队列 ( Packet Queue ) " 中 , 等待封装 ;

复用封装 : 使用 复用器视频包队列 和 音频包队列 封装在一起 , 得到 一个 包含 音频 和 视频 的 文件 ;

  • 音频和视频 按照一定的规则 封装到 文件中 , 播放时再按照相同的规则反向解析 , 解析出原始的音视频数据进行播放 ;

视频采样编码封装 的过程 是下图 红色矩形框内的过程 :
在这里插入图片描述





二、音频采集处理流程



音频文件从录音到生成文件的全过程 :

采集音频帧 : 麦克风 硬件 负责 采集音频 , 采集的 初始音频 称为 " 采样 " , 一秒钟 采集 的 采样 数量 称为 " 采样率 " , 如 : 44100Hz 采样率 就是 一秒钟采集了 44100 个采样点 ; 采样帧 一般一帧封装若干采样点 , 如 10 毫秒的采样点 也就是 441 个采样 作为一帧数据 ;

  • 采样时需要一个 同步时钟信息 , 记录当前采样的时间 , 这是复用和解复用时进行时钟同步的重要依据 ;
  • 每帧 采样帧数据都要打上一个时间戳 ;
  • 图像帧 和 音频采样帧 使用的是相同的时钟源 , 这样借助该时钟可以进行 音视频同步 操作 ;

音频处理 : 如果想要 对音频声音进行修改 , 如 : 变声 , 增加混响音效 , 噪声处理 等 , 可以针对 " 音频帧 " 进行修改 , 修改的过程就是 " 音频处理 " ;

采样帧队列 : 将 处理完毕 的 采样帧 , 放到一个 " 采样帧队列 ( Frame Queue ) " 中 , 等待 音频编码 ;

视频编码 : 在 采样帧队列 ( Frame Queue ) 中的 PCM 原始音频数据 , 体积非常大 , PCM 就是 WAV 格式的音频 , 没有经过任何压缩 , 音频必须要进行编码 , 编码为 mp3 或 ogg 格式 , 能压缩 10 倍的大小 ;

  • 1 秒钟有 44100 个采样 , 双通道立体声 , 每个采样 16 位 , 则 1 分钟的音频有 1 × 60 × 44100 × 2 × 2 1 \times 60 \times 44100 \times 2 \times 2 1×60×44100×2×2 字节大小 ;

音频包队列 : 将 采样帧 编码 后 , 放到 音频包 中 , 然后将若干 音频包 放到 " 音频包队列 ( Packet Queue ) " 中 , 等待封装 ;

复用封装 : 使用 复用器视频包队列 和 音频包队列 封装在一起 , 得到 一个包含 音频 和 视频 的 文件 ;

  • 音频和视频 按照一定的规则 封装到 文件中 , 播放时再按照相同的规则反向解析 , 解析出原始的音视频数据进行播放 ;

音频采样编码封装 的过程 是下图 红色矩形框内的过程 :

在这里插入图片描述





三、音视频文件解封装播放流程



拿到 音视频 文件后 , 播放该文件 , 需要经过以下步骤才能播放出来 :


解复用 : 复用 是 将 音频包队列 ( Packet Queue ) 和 视频包队列 ( Packet Queue ) 封装为一个 音视频文件 , purple解复用是 复用 的 逆向过程 , 就是将 音视频文件 解封装为 音频包队列 ( Packet Queue ) 和 视频包队列 ( Packet Queue ) ;


解码操作 : 与上一个章节 编码 操作相对应 , 是 编码 的 逆向过程 ;

  • 音频解码 : 音频包队列 ( Packet Queue ) 通过 音频解码 , 解码为 采样帧队列 Frame Queue ;
  • 视频解码 : 视频包队列 ( Packet Queue ) 通过 视频解码 , 解码为 视频帧队列 Frame Queue ;

音视频同步 : 解码后的 采样帧队列 和 视频帧队列 , 需要 根据每一帧的 时钟信息 , 进行 音视频同步操作 ;


音视频处理 :

  • 音频处理 : 对 解码后的 采样帧 添加效果 , 如 : 混响 , 重低音 , 除噪音 , 变声 , 变调 , 变速 等效果 ;
  • 视频处理 : 对 解码后的 视频帧 添加效果 , 如 : 美颜 , 滤镜 , 亮度 , 字幕 等效果 ;

音视频播放 :

  • 处理后的音频 送到 扬声器 / 耳机 等设备中进行播放 ;
  • 处理后的视频 送到 显示器 设备中播放 ;

在这里插入图片描述

更多推荐

IMX6ULL ARM Linux开发板SD卡启动,SD卡的分区与分区格式化创建

一、确定TF卡挂载到ubuntu上的设备名称及分区情况1.在ubuntu不接入TF卡的情况下,使用df-lh/dev/sd*命令查看当前"/dev/sd开头"的设备。##输入df-lh/dev/sd*命令,敲回车键~$df-lh/dev/sd*2.将TF卡接入到ubuntu,再次使用df命令,进行查看,多出来的设备即是

【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )

文章目录一、C语言中的三目运算符二、C语言中三目运算符不能作为左值三、C++语言中的三目运算符增强四、C语言中三目运算符作为左值使用一、C语言中的三目运算符C语言中的"三目运算符",又称为"条件运算符",相当于一个简化版本的ifelse语句;三目运算符语法:condition?expression1:expressio

STM32--PWR电源控制

文章目录PWR电源电源管理器上电复位(POR)和掉电复位(PDR)可编程电压监测器(PVD)低功耗模式睡眠模式停止模式待机模式睡眠模式工程停止模式待机模式PWRSTM32的PWR模块是其电源管理系统的核心部分,负责控制和管理芯片的供电和电源状态。电源STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器

【C++】C++ 引用详解 ⑨ ( 常量引用初始化 | C / C++ 常量分配内存的四种情况 )

文章目录一、常量引用初始化1、使用"普通变量"初始化"常量引用"2、使用"常量/字面量"初始化"常量引用"3、C/C++常量分配内存的四种情况4、代码示例-常量引用初始化一、常量引用初始化1、使用"普通变量"初始化"常量引用"使用"普通变量"初始化"常量引用",就是将普通变量赋值给常量应用,也可以理解为将变量转为常量;

cognex Insight相机与机器人配合标定的方法(转载不易)

PCBased原理类似,可以参考本文的方法。视觉定位引导4轴或6轴机器人相机固定安装在支架上,或者安装在机器人上首先需要了解的……是否是多相机引导的对位贴合类项目?对位贴合类项目,不论采用机器人还是运动平台,考虑采用AlignplusTA;是否是单相机引导?还是多相机多工位组合装配?多相机多工位组合装配引导,考虑采用V

DNG格式详解,DNG是什么?为何DNG可以取代RAW统一单反相机、苹果安卓移动端相机拍摄输出原始图像数据标准

返回图像处理总目录:《JavaCV图像处理合集总目录》前言在DNG格式发布之前,我们先了解一下之前单反相机、苹果和安卓移动端相机拍照输出未经处理的原始图像格式是什么?RAW什么是RAW?RAW是未经处理、也未经压缩的格式。可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。RAW是CMOS或者CCD图像

设计模式-原型模式

相信很多同学小时候都玩过《超级马里奥》这款游戏,不知道你是否还记得你曾经营救过的公主?你们在一起了吗?哈哈!小时候我家可没这个条件,经常跑到同学家里玩(或者看别人玩),可羡慕死我了。小的时候只知道玩,长大后才知道原来这么多关卡的马里奥竟然只占用40KB,我现在随手拍张照片也有个5MB左右呀!后来经过查阅资料才知道其中的

SpringBoot中级开发--事务配置管理(10)

事务在整个开发框架中是一个非常常用的功能,特别涉及到数据库操作。像Mysql,就有4个数据库级别:(1)READUNCOMMITTED(读未提交):允许读取未提交的数据。这种级别的事务可以读取到其他事务未提交的数据,可能会导致脏读、不可重复读和幻读等问题。(2)READCOMMITTED(读已提交):只能读取已经提交的

接口测试工具详解

首先,什么是接口呢?接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用他提供的接口就能使用他写好的方法,从而达到数据共享的目的,比如说咱们用的app、网址这些它在进行

c#设计模式-创建型模式 之 建造者模式

简介:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。意图是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。建造者模式的核心思想就是将一个复杂对象的构建与其表示分

二,手机硬件参数介绍和校验算法

系列文章目录第一章安卓aosp源码编译环境搭建第二章手机硬件参数介绍和校验算法第三章修改安卓aosp代码更改硬件参数第四章编译定制rom并刷机实现硬改(一)第五章编译定制rom并刷机实现硬改(二)第六章不root不magisk不xposedlsposedfrida原生修改定位第七章安卓手机环境检测软件分享第八章硬改之设

热文推荐