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中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,