【音视频基础】AVI文件格式

news2025/1/15 13:48:25

AVI文件采用的是RIFF文件结构方式。波形音频wave,MIDI和数字视频AVI都采用这种格式存储。
AVI文件的整体结构如下图所示
在这里插入图片描述

构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分

  • 4字节的数据块标记(或者叫做数据块的ID)
  • 数据块大小
  • 数据

整个RIFF文件可以看成一个RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种子块的ID为“LIST”称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。

RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下

  • 4字节的数据块标记(Chunk ID)
  • 数据块的大小
  • 4字节的形式类型或者列表类型
  • 数据
//Chunks
typedef struct {
DWORD dwFourCC
DWORD dwSize      //data
BYTE data[dwSize] // contains headers or video/audio data
} CHUNK;
 
//Lists
typedef struct {
DWORD dwList
DWORD dwSize        //dwFourcc + data
DWORD dwFourCC
BYTE data[dwSize-4] // contains Lists and Chunks
} LIST;

整个AVI文件是一个类型码为为"AVI "的RIFF块,其主要有三个subchunk构成:

  • 信息块(“hdrl” LIST块,用于描述AVI的流数据格式)
  • 数据块(“movi” LIST块,用于保存音视频序列数据)
  • 索引块(可选的,"idxl"子块)

AVI文件的展开结构大致如下:
在这里插入图片描述

在这里插入图片描述
avih块用于描述avi文件信息

其结构如下
在这里插入图片描述

typedef struct
{
    FourCC fcc;                  // 必须为 avih
    DWORD cb;                    // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
    DWORD dwMicroSecPerFrame;    // 视频帧间隔时间(以毫秒为单位)
    DWORD dwMaxBytesPerSec;      // 这个AVI文件的最大数据率
    DWORD dwPaddingGranularity;  // 数据填充的粒度
    DWORD dwFlags;               // AVI文件的全局标记,比如是否含有索引块等
    DWORD dwTotalFrames;         // 总帧数
    DWORD dwInitialFrames;       // 为交互格式指定初始帧数(非交互格式应该指定为0)
    DWORD dwStreams;             // 本文件包含的流的个数
    DWORD dwSuggestedBufferSize; // 建议读取本文件的缓存大小(应能容纳最大的块)
    DWORD dwWidth;               // 视频图像的宽(以像素为单位)
    DWORD dwHeight;              // 视频图像的高(以像素为单位)
    DWORD dwReserved[4];         // 保留
} AVIMainHeader;

strh用于描述流的头信息

在这里插入图片描述

// AVI流头部
typedef struct
{
    FourCC fcc;                 // 必须为 strh
    DWORD cb;                   // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
    FourCC fccType;             // 流的类型: auds(音频流) vids(视频流) mids(MIDI流) txts(文字流)
    FourCC fccHandler;          // 指定流的处理者,对于音视频来说就是解码器
    DWORD dwFlags;              // 标记:是否允许这个流输出?调色板是否变化?
    WORD wPriority;             // 流的优先级(当有多个相同类型的流时优先级最高的为默认流)
    WORD wLanguage;             // 语言
    DWORD dwInitialFrames;      // 为交互格式指定初始帧数
    DWORD dwScale;              // 每帧视频大小或者音频采样大小
    DWORD dwRate;               // dwScale/dwRate,每秒采样率
    DWORD dwStart;              // 流的开始时间
    DWORD dwLength;             // 流的长度(单位与dwScale和dwRate的定义有关)
    DWORD dwSuggestedBufferSize;// 读取这个流数据建议使用的缓存大小
    DWORD dwQuality;            // 流数据的质量指标(0 ~ 10,000)
    DWORD dwSampleSize;         // Sample的大小
    RECT rcFrame;               // 指定这个流(视频流或文字流)在视频主窗口中的显示位置,视频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定
} AVIStreamHeader;

该块用于描述流的具体信息。如果是视频流(vids,由strh块得知),用一个BitmapInfo结构体表示,如果是音频流(auds),用WaveFormatEx结构体表示。

在这里插入图片描述
数据块中存储视频和音频数据流,数据可直接存于“movi LIST”中。数据块中音视频数据按不同的子块存放,其结构如下所述
音频子块
“##wb”
Wave 数据流
视频子块中存储DIB数据,又分为压缩或者未压缩DIB
“##db”
RGB数据流
“##dc”
压缩数据流
索引块包含数据块在文件中的位置索引,能提高avi文件的读写速度。这个块不是必需的。

音视频教程
整理了一些 音视频流媒体开发 学习书籍、视频资料,有需要的可以自行添加学习交流群:739729163 领取哦!!!
在这里插入图片描述

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

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

相关文章

2023-11-18 Android Linux资源限制命令 ulimit,比如ulimit -d 是设置进程占用的最大数据段大小,默认是unlimited。

一、通过ulimit -a 命令可以查看当前的各种资源限制,比如ulimit -d 是 进程占用的最大数据段大小。 # ulimit -a -t: time(cpu-seconds) unlimited -f: file(blocks) unlimited -c: coredump(blocks) 0 -d: data(KiB) unlimited -s:…

学习.NET验证模块FluentValidation的基本用法

开源博客项目Blog .NET中使用FluentValidation验证部分对象实例的属性值,本文学习FluentValidation模块的基本用法,后续再学习Blog .NET项目FluentValidation模块的用法。   FluentValidation模块支持Linq 表达式,同时支持链式操作&#xf…

【Linux】进程间通信 -- 共享内存

共享内存 共享内存是SystemV标准进程间通信的一种&#xff0c;该标准还有消息队列和信号量&#xff0c;但下文主要介绍共享内存&#xff0c;然后在谈一下信号量的内容。SystemV标准的进程间通信可以看做单机版的进程间通信。 // 1. log.hpp #pragma once#include <iostrea…

100张照片带你了解真实的日本人

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 今年三个月内去了两次日本旅行&#xff0c;到了东京、横滨、大阪、京都、奈良、富士山、神户、富士山等城市&#xff0c;途中一共拍下了10000张照片。 最近整理照片的过程中&#xff0c;发现也拍了许多有意思的人像照&…

〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

应用场景丨迭代市政综合管廊监测系统建设

市政综合管廊是指在城市地下建造的隧道空间&#xff0c;将市政、电力、通讯、燃气、给排水等各种管线集于一体&#xff0c;实施统一规划、设计、建设和管理。综合管廊有利于解决反复开挖路面、架空线网密集、管线事故频发等问题&#xff0c;是保障城市运行的重要基础设施和“生…

Ubuntu 22.04安装Rust编译环境并且测试

我参考的博客是《Rust使用国内Crates 源、 rustup源 |字节跳动新的 Rust 镜像源以及安装rust》 lsb_release -r看到操作系统版本是22.04,uname -r看到内核版本是uname -r。 sudo apt install -y gcc先安装gcc&#xff0c;要是结果给我的一样的话&#xff0c;那么就是安装好了…

ElasticSearch快速入门

一、全文检索 1、什么是全文检索 全文索引是一种通过对文本内容进行全面索引和搜索的技术。它可以快速的在大量文本数据中查找包含特定关键词或短语的文档&#xff0c;并返回相关的搜索结果。 全文检索广泛应用于各种信息管理系统和应用中&#xff0c;如搜索引擎、文档管理系…

项目踩坑之面试遇到的问题及解决

第一点&#xff1a; 问题 遇到的问题之&#xff1a;在实现后台管理端-账户操作的时候&#xff0c;添加员工的时候如果重复添加同一个员工&#xff0c;会触发一个数据库唯一约束异常&#xff0c;但客户端无法清晰的理解这个错误&#xff0c;所以我们就对新增员工的代码进行try…

【数据结构】树与二叉树(二十):树获取大儿子、大兄弟结点的算法(GFC、GNB)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子结点的算法&#xff08;GFC&#xff09;…

Linux系统yum安装

目录 一.yum配置文件 1.yum主配置文件 2.yum仓库文件 3.yum日志文件 二.yum命令 1.yum查询命令 ①. yum list [软件名] ②. yum info [软件名] ③. yum search <关键词> ④. yum provides <关键词> ⑤. yum grouplist [包组名] ⑥. yum groupinfo <包…

python基础练习题库实验2

题目1 编写一个程序&#xff0c;要求用户输入产品代码、产品名称、产品尺寸和产品价格。 然后使用字符串格式来显示产品信息&#xff0c;就像下面的示例一样。 请注意&#xff0c;价格必须使用两位十进制数字显示。 代码 product_code input("Enter product code: &q…

智能售货柜:小本投资的不二之选

智能售货柜&#xff1a;小本投资的不二之选 智能售货柜的运营优势在于&#xff1a;一是降低运营成本&#xff0c;不需要大量员工&#xff1b;二是具备自动识别和智能结算功能&#xff0c;提高运营效率&#xff1b;三是提供数据分析&#xff0c;优化产品和服务。相比传统零售店&…

趣学python编程 (一、计算机发展历史)

未来是高度科技化和智能化的时代。过去不识字的叫“文盲”&#xff0c;如今不懂点计算机知识&#xff0c;则可能是新时代的“文盲”。不论从事什么行业&#xff0c;了解下计算机和编程都是有益的。Python 连续多年占据最受欢迎的编程语言榜首&#xff0c;未来Python有机会成为像…

Docker 可视化面板 ——Portainer

Portainer 是一个非常好用的 Docker 可视化面板&#xff0c;可以让你轻松地管理你的 Docker 容器。 官网&#xff1a;Portainer: Container Management Software for Kubernetes and Docker 【Docker系列】超级好用的Docker可视化工具——Portainer_哔哩哔哩_bilibili 环境 …

读像火箭科学家一样思考笔记02_与不确定性共舞(下)

1. 万有理论 1.1. 相对论 1.1.1. 适用于体积非常大的物体 1.2. 量子力学 1.2.1. 适用于非常小的物体 1.2.2. 在量子力学诞生之前&#xff0c;物理学一直强调的是因果关系&#xff0c;即做这件事&#xff0c;就会得到那个结果 1.2.3. 量子力学讲的似乎是&#xff1a;当我们…

ChinaSoft 论坛巡礼 | 新兴系统软件论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

golang学习笔记——接口

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002 Go 语言接口 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具…

如何在3DMax中使用超过16个材质ID通道?

3DMAX效果通道扩展插件EffectsChannelEx教程 3DMax的材质ID通道允许我们生成渲染元素&#xff0c;这些元素可用于在合成或其他软件中产生处理或特殊效果。如对渲染或动画进行颜色校正。你可以在Photoshop中为你的静态3D渲染图像做这件事。或者使用After Effects、Blackmagic Fu…

gRPC 四模式之 服务器端流RPC模式

服务器端流RPC模式 在一元 RPC 模式中&#xff0c;gRPC 服务器端和 gRPC 客户端在通信时始终只有一个请求和一个响应。在服务器端流 RPC 模式中&#xff0c;服务器端在接收到客户端的请求消息后&#xff0c;会发回一个响应的序列。这种多个响应所组成的序列也被称为“流”。在…