音视频的文件封装——AVI、MP4、MKV

embedded/2025/2/11 22:18:08/

1.AVI(Audio Video Interleave)

由微软在 1992 11 月推出的一种多媒体文件格式, AVI 文件通常不进行压缩或使用无损压缩,因此文件体积相对较大。尽管AVI 已经属于老旧的技术,但是由于 Windows 的通用性,和简单易懂的开发 API ,仍被广泛使用。
AVI 的文件结构分为 头部 主体 索引 三部分。主体中图像数据和声音数据是交互存放的。从尾部的索引可以索引跳到自己想放的位置。
AVI 将视频和音频封装在一个文件里,其顺序是:若干视频帧( Video Frame )之后接着若干音频帧(Audio Frame ),再然后是视频帧、音频帧,故名为 音频视频交织 ,意即音频和视频按帧交错排列,以此达到音频同步于视频播放的效果。

1.1 基础文件格式

AVI 文件中,有两种最基础的结构,分别是 chunk list
Chunk 是用来描述音频 / 视频 / 字幕等数据,其结构如下所示:
Chunk 标志是由 4 字节 ASCII 码标识符的 FOURCC 编码组成,在 Chunk 标志中的 FOURCC 编码是由一个两位数的流编号和一个定义区块中信息类型的双字符代码。
例如,如果流 0 包含音频,则该流的数据区块将具有 FOURCC“00wb” 。 如果流 1 包含视频,则该流的数据区块将具有 FOURCC“01db” “01dc”
LIST 其实用来包含多个 Chunks 或者多个 LIST ,其结构如下所示:
chunk list 的设计主要是为了组织和管理数据。我们可以把它们想象成文件夹和文件:
  • chunk:就像一个文件,包含具体的数据,比如一段视频帧或音频样本。每个chunk都有一个ID数据内容。
  • list:就像一个文件夹,可以包含多个chunk或其他listlist有一个ID,表示它包含的内容类型,比如视频数据、音频数据等。

1.2 AVI主要结构

一个完整的 AVI 文件通常由如下几个子块组成:
  • ID"AVI"RIFF,文件头
  • ID"hdrl"list,信息块,包含了音视频信息,描述媒体流信息
  • ID"info"list,包含编码该AVI的程序信息
  • ID"junk"chunk,无用的数据,用于字节对齐
  • ID"movi"list,数据块,包含了交错排列的音视频数据
  • ID"idx1"chunk,索引块,包含音视频排列的索引数据(可选块,不存在时seek会慢很多)
1.2.1 hdrl信息块
  • dwMicro SecPerFrame:每帧显示的时间 ns (通过测试了多个音频这个参数都是一样的,存疑!)
  • dwMaxBytesPerSec:文件最大数据传输率
  • dwFlagsAVI文件的特殊属性,包含文件中的任何标志字。如:有无索引块,是否是interlaced是否含版权信息等
  • dwTotalFrames:数据帧的总数
  • dwInitialFrames:在开始播放前需要的帧数
  • dwStreams:文件中包含的数据流种类
  • dwSuggestedBufferSize:建议使用的缓冲区的大小,通常为存储一帧图像以及同步声音所需要的数据之和,大于最大的CHUNK的大小
  • dwWidth:图像宽,像素
  • dwHeight:图像高,像素
1.2.2 info封装流头部

  • fccTypevids(视频数据流)auds(音频数据流)txts(字幕)
  • fccHandler:编码器codec类型
  • dwFlag:流属性,AVISF_DISABLED(流默认不激活);AVISF_VIDEO_PALCHANGES(流使用调色板进行视频帧调色)
  • wPriority:流的播放优先级
  • wLanguage:语言
  • dwInitialFrames:流中第一个块block的编号
  • dwScaledwRate/dwScale ,对于视频来说,表示为帧率;对于音频来说,表示为采样率。
  • DwRate:比特率
  • dwState:开始播放的时间,VBR audio表示流起播放钱应该silent的时间。
  • dwLength:文件长度
  • dwSuggestedBufferSize :缓冲区大小
  • dwSampleSize :流所占字节数,可用于计算 Chunk 时长。
  • rcFrame :视频图像所占的矩形
    1.2.3 info位图信息头部
  • biSize:位图结构体大小
  • biWidth:位图宽度
  • biHeight:位图高度
  • biPlanes:颜色平面数,通常为1。这个字段几乎总是设置为1,因为大多数位图都是单一颜色平
  • 面。
  • biBitCount:颜色要用到的位数,1(黑白双色图);416色图);8256色图);24(真彩色图)
  • biCompression:位图是否被压缩
  • biSizeImage:位图数据的大小
  • biXPelsPerMeter:水平分辨率,以像素每米为单位。这个值指示图像在水平方向上的分辨率。
  • biYPelsPerMeter:垂直分辨率,以像素每米为单位。这个值指示图像在垂直方向上的分辨率。
  • biClrUsed:位图实际使用的颜色数。如果这个值为0,表示使用所有可能的颜色。
  • biClrImportant:对图像显示有重要影响的颜色数。如果这个值为0,表示所有颜色都重要。
1.2.4 info音频信息头部
  • wFormatTag:编码格式,包括WAVE_FORMAT_PCMWAVEFORMAT_ADPCM
  • nChannels:声道数
  • nSamplesPerSec: 采样率
  • nAvgBytesPerSec:每秒的数据量
  • nBlockAlign: 数据块对齐标志
  • wBitsPerSample: 每次采样的数据量
  • cbSize:大小
1.2.5 movi数据块
movi 中存储音视频数据,以交错方式进行存放,其中音视频子块的种类有: db( 未压缩的视频
)/dc( 压缩的视频帧 )/wb( 音频数据 )/pc( 使用调色板 )
对于 dc 类型且存放 H264 码流的文件格式为:
对于 wb 类型且存放 adts 码流的文件格式为:
1.2.6 idx1索引块
索引块是可选的,其主要功能是描述音视频数据的索引信息,在 1.2.2 info 封装流头部的 flag 中有指定是否包含索引块。当一个AVI 文件中有索引块可以快速的进行视频的快进,没有索引块需要重新计算位置。

索引块中包含每一个流的每一个索引信息,也就是它和movi数据块是对应的。

1.3 封装H264码流和AAC码流

使用FFMPEG库合成H264视频和AAC音频

ffmpeg -i input.h264 -i input.aac -c:v copy -c:a copy output.avi

输出文件的持续时间与最短的输入流匹配

ffmpeg -i input.h264 -i input.aac -c:v copy -c:a copy -shortest output.avi


http://www.ppmy.cn/embedded/161433.html

相关文章

Arbess基础教程-创建流水线

Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具,本文将介绍如何使用 Arbess 配置你的第一条流水线,以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息,如分组,环境&…

25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆

雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂,其末端执行器的位置可以表示为: 其中: L1​ 和 L2 是机器人臂的长度。θ1​ 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…

在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合

文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码(Positional Encoding)1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…

java项目之健达企业项目管理系统的设计与实现源码(ssm+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的健达企业项目管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 健达企业项目…

Spring Boot 需要独立的容器运行吗

Spring Boot 不需要独立的容器运行,它内置了一个嵌入式的Web服务器(如Tomcat、Jetty或Undertow),所以可以直接作为一个独立的应用程序运行,而不需要外部的Servlet容器。你只需要运行Spring Boot应用,它会自…

【机器学习与数据挖掘实战】案例13:基于BP神经网络模型的家用热水器用户行为分析与事件识别

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…

在Uniapp中使用阿里云OSS插件实现文件上传

在开发小程序时,文件上传是一个常见的需求。阿里云OSS(Object Storage Service)是一个强大的云存储服务,可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…

PID 算法简介(C语言)

一、简介: PID是比例、积分、微分三个环节的组合,用来进行反馈控制。每个部分都有对应的系数,也就是Kp、Ki、Kd。PID 算法实现这三个部分的计算,然后综合起来得到控制输出。 二、PID控制器结构体: PID控制器结构体:包含PID参数(Kp, Ki, Kd);存储积分项和上一次误差;…