AVI和WAV文件格式和实例分析

2024-04-17 17:32

本文主要是介绍AVI和WAV文件格式和实例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、AVI文件分析

二、WAV文件分析

1.WAV格式介绍

2.WAV文件构成

(1)各子块格式分析

(2)data子块数据分布

3.实例分析 


一、AVI文件分析

通过AVI文件分析器打开一个AVI文件,可看出音频和视频数据是交织放置的

其两个数据流如下:

// AVIMAINHEADER
public static readonly int AVIF_HASINDEX = 0x00000010;       //文件最后是否有索引
public static readonly int AVIF_MUSTUSEINDEX = 0x00000020;   //必须使用索引
public static readonly int AVIF_ISINTERLEAVED = 0x00000100;  //交错放置
public static readonly int AVIF_TRUSTCKTYPE = 0x00000800;    //使用CKtype查找帧
public static readonly int AVIF_WASCAPTUREFILE = 0x00010000; //捕获文件
public static readonly int AVIF_COPYRIGHTED = 0x00020000;    //受版权保护

二、WAV文件分析

1.WAV格式介绍

WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字。

2.WAV文件构成

(1)各子块格式分析

WAV文件是属于RIFF结构形式的文件,这种结构是一种树状结构,其最基本的组成单元是chunk(块),而每一个chunk则由辨识码,数据大小,以及数据本身组成,其中辨识码就是RIFF四个字母的ASCII码,共占用4个字节,用十六进制表示就是52 49 46 46;辨识码之后的四个字节,表示除去文件辨识码和它自己之后剩余文件的大小,最后就是文件的数据。

而WAV格式的文件除了前面的文件头之后,还包含三个子块:

  • format子块主要用于描述该wav文件的信息,例如,采样率,数据量,编码格式,声道数等,其结构也如RIFF,最开始4个字节表示标识符“fmt”,接着四个字符表示该块大小,后面的18个字节则表示文件的信息,在format子块中WAVEFORMATEX占了18字节,而标准的WAV应该是16字节,只有一些软件生成的文件会在其后面增加两个字节的附加信息;
  • fact子块并不是必须的,在标准的WAV文件中没有该子块,只有一些软件转化而来的才会增加该子块,其主要存储关于该文件内容的重要信息;
  • data块则主要就是WAV文件真正能播放的声音数据部分。
子块内容字节数端序
文件头标识符(RIFF)4 Bytes大端
数据大小4 Bytes小端
格式辨识码(WAVE)4 Bytes大端
数据format子块“fmt”4 Bytes大端
Size(该区块数据长度)4 Bytes小端

AudioFormat(音频格式)

2 Bytes小端
NumChannels(声道数)2 Bytes小端
SampleRate(采样率)4 Bytes小端
ByteRate(每秒数据字节数)4 Bytes小端
BlockAlign(每个采样所需的字节数)2 Bytes小端
BitsPerSample(采样位数)2 Bytes小端
fact子块"fact"4 Byte大端
子块大小4 Byte小端
子块数据4 Byte小端
data子块“data”4 Byte大端
音频数据的长度4 Byte小端
音频数据4 Byte小端
  • 端序:小端:低位在前,高位在后;大端:高位在前,低位在后
  • ByteRate每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
  • BlockAlign每个采样所需的字节数 = NumChannels * BitsPerSample / 8
  • BitsPerSample每个采样存储的bit数,8:8bit,16:16bit,32:32bit
  • 音频数据的长度 = ByteRate * seconds

(2)data子块数据分布

  • 8bit单声道
采样1采样2
数据1数据2
  • 8bit双声道
采样1采样2
声道1数据1声道2数据1声道1数据2声道2数据2
  • 16bit单声道
采样1采样2
数据1低字节数据1高字节数据2低字节数据2高字节
  • 16bit双声道
采样1
声道1数据1低字节声道1数据1高字节声道2数据1低字节声道2数据1高字节
采样2
声道1数据2低字节声道1数据2高字节声道2数据2低字节声道2数据2高字节

3.实例分析 

  • 红色框1: 标识符RIFF(ASCII码)
  • 黄色框2:数据大小=876516字节
  • 绿色框3:文件类型WAVE(ASCII码)
  • 蓝色框4:fmt空
  • 紫色框5:fmt子块数据长度=16
  • 蓝色线1:音频格式PCM
  • 蓝色线2:声道数=2
  • 蓝色线3:采样率=48000Hz
  • 蓝色线4:每秒数据字节数=192000
  • 蓝色线5:每个采样所需的字节数=4
  • 蓝色线6:采样位数=16
  • 橘色框6:DATA(ASCII码)
  • 淡紫色框7:音频数据长度=876480
  • 数据部分

参考文献

avi 文件格式解析_lxmnet123的专栏-CSDN博客_avi格式解析

分析WAV音频文件 - 知乎 (zhihu.com)

WAV文件格式解析_刘东的博客-CSDN博客_wav格式

WAV文件格式详解_imxiangzi的专栏-CSDN博客_wav格式

这篇关于AVI和WAV文件格式和实例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912428

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制