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

news2024/9/29 3:19:47

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.coloradmin.cn/o/1262180.html

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

相关文章

技术SEO的基础知识和 10 个最佳实践

你有没有想过导致某些网站在搜索结果中排名比其他网站更好的因素?针对搜索引擎进行优化是关键(SEO)。SEO,即搜索引擎优化,是一种用于提高网站在搜索引擎中的知名度的方法。技术搜索引擎优化(SEO&#xff09…

用CHAT总结费曼学习法的关键

问CHAT:费曼学习法的关键 CHAT回复:费曼学习法是由著名物理学家理查德费曼所发明的一种学习方法,旨在以深入理解为目标,帮助自己学习新的知识和技能。 费曼学习法有四个关键步骤: 1. 学习:首先&#xff0…

服务器运行情况及线上排查问题常用命令

一、top命令 指令行: top返回: 返回分为两部分 (一)系统概览,见图知意 以下是几个需要注意的参数 1、load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分…

VSCode Vue 开发环境配置

Vue是前端开发中的重要工具与框架,可以保住开发者高效构建用户界面。 Vue2官方文档:https://v2.cn.vuejs.org/ Vue3官方文档:https://cn.vuejs.org/ Vue的安装和引用 Vue2的官方安装指南:https://v2.cn.vuejs.org/v2/guide/ins…

数据分析工具比较:Excel vs Python vs R

写在开头 在数据分析的世界里,选择合适的工具至关重要。本篇博客将深入比较常用的数据分析工具,包括Excel、Python和R,以帮助读者更好地选择适合自己需求的工具。 1.Excel:经典易用的电子表格 优势: 用户友好: Excel是大多数人熟悉的电子表格工具,使用简单,无需编程…

汽车电子 -- 车载ADAS之RCTA(后方横向来车预警 )

国际标准: RCTA: GB/T XXXXX—XXXX 乘用车后部交通穿行提示系统性能要求及试验方法 一、后方横向来车预警RCTA( Rear Cross Traffic Assist) 在车辆倒车时,实时监测车辆后方横向接近的其它道路使用者,并在可能发生碰撞危险时发…

稳定视频扩散数据管理解密【stable video diffusion】

Stability AI 最近于 2023 年 11 月 21 日推出了其最新模型—稳定视频扩散(SVD)。视频生成模型的这一突破取决于数据管理的关键作用。 除了模型检查点之外,他们还发布了一份技术报告。 让我们在 Stability AI 的技术报告和一些引人注目的示例…

仿东郊到家预约按摩小程序开发;

在这个快节奏的现代社会,人们对便捷、高效的服务需求日益增大。正因如此,到家预约系统上门按摩小程序应运而生,它结合了互联网技术和传统按摩服务,不仅满足了人们对便捷按摩服务的需求,还为商家提供了全新的商业价值。…

2、XFP 与 SFP+:有什么区别?

在光纤网络领域,光模块是促进数据顺利传输的重要组件。市场继续接受10G XFP和10G SFP等10G光模块,促使人们对XFP与SFP进行更仔细的审视。他们有什么区别?XFP和SFP的定义是什么?他们的应用场景又如何呢?在下文中寻找所有…

Vue3-Eslint配置代码风格

prettier风格配置 官网:https://prettier.io Eslint:代码纠错,关注于规范 prettier:专注于代码格式化的插件,让代码更加美观 两者各有所长,配合使用优化代码 生效前提: 1)禁用…

基于JavaWeb+SSM+Vue校园综合服务小程序系统的设计和实现

基于JavaWebSSMVue校园综合服务小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 I Abstract II 第一章 绪 论 1 1.1选题背景 2 1.2研究现状 3 1.3研究内容 …

C/C++ Zlib实现文件压缩与解压

在软件开发和数据处理中,对数据进行高效的压缩和解压缩是一项重要的任务。这不仅有助于减小数据在网络传输和存储中的占用空间,还能提高系统的性能和响应速度。本文将介绍如何使用 zlib 库进行数据的压缩和解压缩,以及如何保存和读取压缩后的…

打游戏NVIDIA怎么设置性能最好?

打游戏NVIDIA怎么设置性能最好?当前很多用户都在Win10电脑上畅玩游戏,所以想知道NVIDIA控制面板最佳设置方法,更好地发挥NVIDIA控制面板性能,用户就能享受更棒的游戏乐趣。接下来小编给大家详细介绍NVIDIA显卡游戏最佳设置步骤教程…

【密码学引论】Hash密码

第六章 Hash密码 md4、md5、sha系列、SM3 定义:将任意长度的消息映射成固定长度消息的函数功能:确保数据的真实性和完整性,主要用于认证和数字签名Hash函数的安全性:单向性、抗若碰撞性、抗强碰撞性生日攻击:对于生日…

antd vue a-select 下拉框位置偏移

问题 下拉框未固定 原因 select下拉框的定位是根据body定位 解决方法 在select 标签中添加: :getPopupContainer"(triggerNode) > (triggerNode.parentElement)" :getPopupContainer"(triggerNode) > (triggerNode.parentElement)"…

第20章多线程

创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类,从类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行,任务是指线程在启动时执行的工作,start() 方法启动线程&am…

leetcode 1670

leetcode 1670 解题思路 使用2个deque作为类的成员变量 code class FrontMiddleBackQueue { public:deque<int> left;deque<int> right;FrontMiddleBackQueue() {}void pushFront(int val) {left.push_front(val);if(left.size() right.size()2){right.push_fr…

IDEA编译器技巧-提示词忽略大小写

IDEA编译器技巧-提示词忽略大小写 写代码时,每次创建对象都要按住 Shift 字母 做大写开头, 废手, 下面通过编译器配置解放Shift 键 setting -> Editor -> General -> Code Completion -> Match case 把这个√去掉, 创建对象就不需要再按住 Shift 键 示例: 1.…

【1】AR Tag 在ros中的使用

1.定义 AR Tag 是一种用于增强现实&#xff08;AR&#xff09;应用中的视觉标记&#xff0c;用于跟踪和定位虚拟物体在现实世界中的位置。 AR Tag由黑白正方形图像表示&#xff0c;图像内部有黑色边框中的某些图案。它与我们经常用到的二维码长得类似&#xff0c;原理其实也一…

Spring Cloud+Nacos 注册中心详解及开发示例

目录 一、Nacos 的关键特性包括: 二、逻辑架构及其组件介绍 三、Nacos安装 1、版本选择 2、预备环境准备 3、下载源码或者安装包 4、启动服务器 5、关闭服务器 四、如何引入 Nacos Discovery Starter 五、启动一个 Provider 应用 1 pom.xml的配置。一个完整的 pom.xm…