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

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格式。本文分析这两种格式。

二、wav和pcm格式文件介绍

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

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

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

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

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

三、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.pcm将pcm格式转变为wav格式:
ffmpeg -f s16le -ar 44100 -ac 2 -i D:\output.pcm c:\output.wav

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jetson nano 串口通信

目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…

【Java Spring】SpringBoot 日志系统

文章目录 一、Spring Boot 日志系统1.1 Spring Boot 日志框架1.2 自定义日志打印1.3 日志级别设置1.4 日志持久化1.5 lombok 简化日志输出 一、Spring Boot 日志系统 1.1 Spring Boot 日志框架 SLF4J 和 logback都是spring boot内置的日志框架,开发者只负责调用对…

蓝桥杯第100 题 九宫幻方 DFS 全排列 C++ 解题思维

题目 九宫幻方https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&name%E4%B9%9D 思路和解题方法 一 (DFS) 首先,定义了一些全局变量和数组。vis数组用于标记已经出现过的数字,a数组用于存储数独的初始状态…

ensp 启动设备时报40错误,然后一直没有去管,再次进去就好了,我知道是配置虚拟机的时候修改了一些设置:

第一个阶段: 那时我是重置电脑之后就安装了ensp所以没有出现什么问题,(那时没有导入ce6800和12800还有防火墙6000) 第二个阶段: 因为有华为相关的实验要做,所以心血来潮打开了ensp(路由器之前…

多类场景、遍布各地,融云 IM 支撑多款应用全球增长

(全网都在找的《社交泛娱乐出海作战地图》,点击获取👆) 无论是面向企业场景的工作流协同还是消费场景的网络效应形成,商务社交还是陌生人社交,IM 都是必备组件。IM 遍布互联网各角落,出现在所有…

算法通关村第十二关-黄金挑战字符串冲刺题

最长公共前缀 描述 : 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 题目 : LeetCode 14.最长公共前缀 : 分析 : 第一种方式,我们可以竖着比较,如图所示,每前进一个位置就…

unity学习笔记06

一、预制体 1.定义: 预制体是一种存储了一个或多个游戏对象及其组件的资产。可以将预制体视为游戏对象的模板,它包含了对象的所有属性、组件和初始状态。 2.创建预制体: 在Unity中,可以通过将一个或多个游戏对象拖动到项目窗口…

量子计算软件平台

目录 1.量子语言 2.量子软件开发工具 3.量子云计算平台 1.量子语言 量子语言是一种基于量子计算机的语言,用于描述和实现量子算法。与经典计算机语言不同,量子语言需要考虑量子力学的特殊规则和算法的量子化。其中,最常用的量子语言是量子程…

xxljob学习笔记01(小滴课堂)

分布式调度xxl-job源码部署和数据库建立: 在idea中打开安装包: 创建数据库: 建表: 在项目里: 在navicat里运行语句即可: 修改数据库地址和用户名,密码: 配置令牌,不然谁…

ESP32-Web-Server编程- JS 基础5

ESP32-Web-Server编程- JS 基础5 概述 JS 编程内容颇多,我们提供一些简单的示例,先玩再学,边玩边学。 示例1-演示通过 JS 进行温度转换 资源链接 对应示例的 code 链接 (点击直达代码仓库) 示例2-增加网页弹窗 演…

SSM跆拳道网站系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 跆拳道网站系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模…

Mysql的二阶段提交

先看执行器与InnoDB引擎是如何更新一条指定的数据的 可以看到,InnoDB在写redo log时,并不是一次性写完的,而有两个阶段,Prepare与Commit阶段,这就是"两阶段提交"的含义。 为什么要写redo log,不…