【TinyALSA全解析(二)】wav和pcm音频文件格式详解

news/2024/7/10 18:48:32 标签: pcm, ffmpeg, 音视频, android, 嵌入式, linux, java

wav和pcm音频文件格式详解

  • 一、本文的目的
  • 二、wav和pcm格式文件介绍
  • 三、pcm格式文件解析
  • 四、wav文件内容解析
    • 4.1 文件内容描述
    • 4.2 实战分析
  • 五、如何在各种音频格式之间进行转换

/*****************************************************************************************************************/

声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢!

创作不易,如果文章对你有帮助,麻烦点赞 收藏支持~感谢

/*****************************************************************************************************************/

一、本文的目的

tinyalsa中可以直接传输的是wav文件格式,无论是tinycap还是tinyplay其使用的都是wav文件格式,想要对tinyalsa源码有更详细的了解,需要熟悉wav格式的文件内容。

在安卓音频中常见的两种格式为pcm格式和wav格式。本文分析这两种格式。

pcm_16">二、wav和pcm格式文件介绍

以录音为例说明:
音频驱动传输的数据一般都是原始数据,是由硬件处理得到的一系列数字信号(即由ADC得到的原始数据)。其本身不会包含对声音信息的记录,比如声道数、采样率、位深等等。故此如果你用音乐播放器播放pcm格式的音频文件的时候,就需要指定这个文件的声道数、采样率、位深等等信息。

那么能不能将音频的信息存储在音频文件中,让播放器去读取音频文件的时候,可以顺便读取到音频格式的信息呢?这样就不用每次播放都需要去指定音频格式了。

有的,那就是mp3、wav、aac等等音频格式,其会保存音频的信息(采样率、声道数、位深等信息),当播放器播放的时候,会在文件的指定位置读取音频信息去播放,这样就不用用户去指定音频的信息了,直接点击播放按钮,剩下的就交给软件处理就能让设备发出声音了!

简单理解,wav格式文件内容 = pcm格式文件内容 + 音频描述内容

那为什么不用mp3或者aac格式或者其它格式?因为类似mp3和aac格式是有损且压缩的格式,不仅会丢掉一部分原始音频数据,还要需要编解码(解压 /压缩)处理。
那为什么不用其它无损且不压缩就好了?因为用了其它无损不压缩的格式,你又会问为啥不用wav,是伪逻辑。

pcm_30">三、pcm格式文件解析

如前面分析:pcm格式文件的内容是仅且包含音频原始数据的(原始就是未压缩未丢失的意思)。那么这个文件格式展开就是一系列的声音表示数据了。以某个PCM文件的片段数据“0x01 0x02 0x03 0x04”为例,假如地址是从低到高,不同的音频格式的声音内容如下表示:

音频格式\原始数据0x010x020x030x040x…
8位单声道0声道0声道0声道0声道0声道
8位双声道左声道右声道左声道右声道左声道
16位单声道0声道数据1-低字节0声道数据1-高字节0声道数据2-低字节0声道数据2-高字节0声道数据3-低字节
16位双声道左声道数据1-低字节左声道数据1-高字节右声道数据1-告字节右声道数据1-高字节左声道数据2-低字节

四、wav文件内容解析

4.1 文件内容描述

如前面分析:wav格式文件内容 = pcm格式文件内容 + 音频描述内容

wav文件的格式是怎么样的呢?

可参考网站:http://soundfile.sapp.org/doc/WaveFormat/

文件内容的数据框图:
数据框图

关于这张图的描述:

偏移与大小名称说明
0 4ChunkID包含 ASCII 形式的字母“RIFF”(0x52494646 大端形式)。
4 4ChunkSize36 + SubChunk2Size,或更准确地说:4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)这是此数字之后的块的其余部分的大小。这是整个文件的大小(以字节为单位)减去未包含在此计数中的两个字段的 8 字节:ChunkID 和 ChunkSize。
8 4格式包含字母“WAVE”(0x57415645 大端形式)。
12 4Subchunk1ID包含字母“fmt”(0x666d7420 大端格式)。
16 4Subchunk1Size16 用于 PCM。这是该数字之后的其余子块的大小。
20 2AudioFormatPCM = 1(即线性量化)1 以外的值表示某种形式的压缩。
22 2NumChannelsMono = 1、Stereo = 2 等
24 4SampleRate8000、44100 等
28 4ByteRate== SampleRate * NumChannels * BitsPerSample/8
32 2BlockAlign== NumChannels * BitsPerSample/8 1 的字节数样本包括所有通道。
34 2BitsPerSample8 位 = 8,16 位 = 16,等等
2ExtraParamSize如果是 PCM,则不存在
XExtraParams用于额外参数的空间
36 4Subchunk2ID包含字母“数据”(0x64617461 大端形式)。
40 4Subchunk2Size== NumSamples * NumChannels * BitsPerSample/8 这是数据中的字节数。您还可以将其视为该数字后面的子块的读取大小。
44 *Data实际的声音数据。

4.2 实战分析

以霉霉的stay歌曲为例分析,首先解析文件成二进制的格式,文件前面的部分的内容如下:

xxd -l 176  /d/music/stay.wav
00000000: 5249 4646 9a56 2f02 5741 5645 666d 7420  RIFF.V/.WAVEfmt
00000010: 1000 0000 0100 0200 44ac 0000 10b1 0200  ........D.......
00000020: 0400 1000 4c49 5354 6e00 0000 494e 464f  ....LISTn...INFO
00000030: 4941 5254 0d00 0000 5461 796c 6f72 2053  IART....Taylor S
00000040: 7769 6674 0000 494e 414d 2100 0000 5374  wift..INAM!...St
00000050: 6179 2053 7461 7920 5374 6179 2028 4b61  ay Stay Stay (Ka
00000060: 7261 6f6b 6520 5665 7273 696f 6e29 0000  raoke Version)..
00000070: 4950 5244 0c00 0000 5265 6420 4b61 7261  IPRD....Red Kara
00000080: 6f6b 6500 4953 4654 0e00 0000 4c61 7666  oke.ISFT....Lavf
00000090: 3539 2e33 342e 3130 3100 6461 7461 0056  59.34.101.data.V
000000a0: 2f02 0000 0000 0000 0000 0000 0000 0000  /...............

这个数据是自左向右,自上而下查看,对数据的分析如下:
5249 4646:这是 “RIFF” 的 ASCII 码的十六进制表示,表示这是一个 RIFF 文件格式。

9a56 2f02:这是文件大小字段,表示文件的大小(减去前8个字节)。

5741 5645:这是 “WAVE” 的 ASCII 码的十六进制表示,表示这是一个 WAVE 格式的音频文件。

666d 7420:这是 "fmt " 的 ASCII 码的十六进制表示,表示接下来是音频格式的子块。

1000 0000:这是子块的大小,值为16,表示接下来的16个字节描述音频格式。

0100:这是音频格式代码,值为1,表示这是 PCM 格式的音频。

0200:这是声道数,值为2,表示这是立体声音频。

44ac 0000:这是采样率,值为44100,表示每秒采样44100次。

10b1 0200:这是字节率,值为 176400,表示每秒数据的字节数。

0400:这是块对齐,值为4,表示每个采样包含的字节数。

1000:这是每个样本的位数,值为16,表示这是16位的音频。

接下来的部分包含了一些元数据,如艺术家名字(Taylor Swift)、歌曲名字(Stay Stay Stay (Karaoke Version))、产品名(Red Karaoke)和软件名(Lavf59.34.101)。

最后的 6461 7461 是 “data” 的 ASCII 码的十六进制表示,表示接下来是音频数据的子块。0056 2f02 是子块的大小,表示接下来的音频数据的大小。

接下来的 0000 是音频数据的开始部分,文件的后面的其它内容都是实际的声音数据了。

五、如何在各种音频格式之间进行转换

一般用FFmpeg软件进行转换,先在当前的设备安装好FFmpeg软件,然后用命令行就可以进行转换了,常用的示范如下:

将mp4视频提取wav格式:
ffmpeg -i D:\input.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 D:\output.wav

将wav格式转变为pcm格式:
ffmpeg -i D:\output.wav -f s16le -acodec pcm_s16le D:\output.pcmpcm格式转变为wav格式:
ffmpeg -f s16le -ar 44100 -ac 2 -i D:\output.pcm c:\output.wav

注意上面的命令中指定的采样率为44.1k ,双声道,存储格式是s16le。读者要实际根据想要的目标文件或者源文件的参数进行配置。


http://www.niftyadmin.cn/n/5221622.html

相关文章

ShowWeb-浏览器插件:可视化元素路径查看器

ShowWeb👻:可视化元素路径查看器适配【谷歌】【Edge】 每次写前端最烦的就是一层一层找元素,又臭又长。所以我开发了一个小插件来缓解这个问题,这个插件可以输出整个路径,并把最后元素的内容输出方便查看,…

Linux驱动开发笔记(五):驱动连接用户层与内核层的文件操作集原理和Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134561660 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

回归分析例题(多元统计分析期末复习)

例一 例二 一元线性回归 解: (1)y a ^ \hat{a} a^ b ^ \hat{b} b^x,求线性回归方程即求出 a ^ \hat{a} a^和 b ^ \hat{b} b^ 而 b ^ \hat{b} b^ L x y L x x { {L_{xy}} \over {L_{xx}} } Lxx​Lxy​​ 所以我们首先需要计算 L x…

PyCharm简介与安装

pyCharm的作用 PyCharm是一种Python的集成开发环境,带有一整套可以帮助用户在使用Python语言开发时提高效率的工具 pyCharm的集成 pyCharm的分类 PyCharm的下载 网址:https://www.jetbrains.com/pycharm/download/#sectionwindows PyCharm的安装

重大更新!亚马逊重新推出这一功能,卖家们的新机遇?

虽然同样是亚马逊的客户,可是一直以来似乎平台都是对买家“偏爱”,给卖家的只是严苛的生存环境。 然而最近在黑五网一大促开展得如火如荼之际,亚马逊竟破天荒地为卖家带来一个好消息。 01 三个重大更新 根据亚马逊发布的公告显示&#xff…

Ansys Lumerical|带 1D-2D 光栅的出瞳扩展器

附件下载 联系工作人员获取附件 此示例显示了设置和模拟出瞳扩展器 (EPE) 的工作流程,EPE 是波导型增强现实 (AR) 设备的重要组成部分。该工作流程将利用 Lumerical 和 Zemax OpticStudio 之间的动态链接功能 。为了…

模板方法模式-C语言实现

代码实现&#xff1a; #include <stdio.h>// 定义抽象基类 typedef struct {void (*step1)(void);void (*step2)(void);void (*step3)(void); } AbstractClass;// 具体实现类1 void concreteStep1() {printf("Concrete Step 1\n"); }void concreteStep2() {pr…

修改Linux系统的网络参数

修改Linux系统的网络参数 接收缓冲区是用来存储从网络接口接收到的数据的一块内存区域。通过增大接收缓冲区的大小&#xff0c;可以提高网络传输的性能&#xff0c;特别是在处理大量数据或高负载情况下。 sudo sysctl -w net.core.rmem_max2097152 sudo sysctl -w net.core.r…