原始PCM录制与播放

Posted lozoho

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始PCM录制与播放相关的知识,希望对你有一定的参考价值。

arecord 和 aplay 使用说明

来源:https://blog.csdn.net/liupin2008/article/details/124347278

arecord和aplay是alsa-utils一部分,我们在Linux系统下进行音频开发时经常使用,非常方便。
先简单介绍一下。

arecord 采集原始音频
arecord -r 8000 -t raw -c 1 -f S16_BE ./test

aplay 播放原始音频
aplay -t raw -r 8000 -f S16_BE -c 1 ./test

参数说明:
-r 采样频率 8000 48000 44100等
-t 录音文件类型 voc, wav, raw or au
-c 声道数,1:单声道;2:双声道
-f 采样格式,S16:16位; BE: 大端 ; LE: 小端
最后是 文件路径

注意:播放异常时,检查采集时的参数是否和播放时的参数一致。
————————————————

总结

总结一下,pcm原始数据,录制时使用什么参数,播放时一定要设置一样的参数。不然,听到的就是一团噪音。
比如我的PCM文件,录制时使用参数:频率48000Hz,S16_LE。但是播放时使用命令:

aplay pcm_001.pcm

这个命令就是使用aplay默认参数播放pcm_001.pcm,而默认参数是:Unsigned 8 bit, Rate 8000 Hz, Mono

这样显然听到的就是一团的噪音。

应该使用如下命令:

aplay -t raw -r 48000 -f S16_LE -c 1 ./pcm_001.pcm

类比

1.视频采集时的原始数据yuv,也有不同的参数设置比如YUV420,YUV422,YUV444,还有RGB16,RGB24,RGB32,还有不同宽高的设置,等等。播放时同样需要设置,播放器不知道这个视频文件的宽高,数据排列形式,而且参数没有设置对,就会出现花屏。
如果已经封装过的格式,比如MP4,MKV,这些就是已经把宽高,编码格式都写在文件的开头,播放器就会根据文件头的参数设置编码器和解码器,展示的宽高,音频的参数。

2.图片的原始数据raw,各大相机厂商有不同的格式,比如索尼的ARW,佳能CR2,索尼有自己的软件可以打开这种文件,佳能也有。但是PS的camera raw集成了各家厂商的软件,全部都可以打开并且显示出来。这些原始数据,其实就是二进制数据的集合,各家厂商在文件开头写入了设备的参数,比如设备型号,光圈,快门这些参数。
如果采用压缩格式JPEG保存照片,由于JPEG是一个公开的图片格式,按照固定的格式储存了宽高参数,所以任意一款图片浏览器都可以打开。

使用 Android SDK 从原始 PCM 数据创建 WAV 文件

【中文标题】使用 Android SDK 从原始 PCM 数据创建 WAV 文件【英文标题】:Creating a WAV file from raw PCM data using the Android SDK 【发布时间】:2011-06-14 05:07:11 【问题描述】:

我正在尝试使用 AudioRecord 类来录制 WAV 文件。问题是它只提供原始 PCM 数据,如果我将它写入文件,没有标题信息,所以它不会在任何媒体播放器中播放。如何从这些原始数据创建 WAV 文件?

或者,有没有其他方法可以将 Android 中的声音录制到 WAV 文件(或 MP3)?

哦,我知道 MediaRecorder 不能使用,因为它不支持 WAV 或 MP3 格式。

【问题讨论】:

哦...我已经尝试在 android 中读取原始 PCM 数据...能否请您发布您正在使用的代码? 【参考方案1】:

你可能想使用 mediarecord 类

【讨论】:

为什么?它不支持 WAV 或 MP3 输出【参考方案2】:

好的,我已经弄清楚了。这篇文章对帮助我至关重要: http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java

基本上,我使用 ByteArrayOutputStream 从 AudioRecord 写入原始 PCM 数据,然后在处理完成后让我获取字节数组及其大小。然后,我可以将该数据与 SampleRate、BitRate 和 Stereo/Mono 设置结合使用,按照上面的链接创建 WAV 标头。生成的文件完美运行!

【讨论】:

您能否展示一个示例代码,您是如何做到这一点的。我有类似的要求 您能告诉我您是如何在代码中使用 wavIo 文件的吗?主要有两种方法,读取和保存。我正在使用 AudioRecord 类在 android 中录制音频。我正在逐字节写入数据。由于我的音频没有正确录制,请您帮忙。 链接已损坏。您仍然可以访问此代码或说明解决方案的示例吗?【参考方案3】:

检查MediaRecorder.setOutputFormat(),你可以为你的录音设置不同的容器格式;有 MediaRecorder.OutputFormat.MPEG_4 和 MediaRecorder.OutputFormat.THREE_GPP; RAW 中唯一允许的格式是 setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

抱歉,MP3 不可用。你真的需要mp3来录音吗? 与 MP3 相对的 WAV 是一个容器,而不是一个格式; WAV 可以是任何一种编码格式。

您始终可以在原始 pcm 数据前添加一些 WAV RIFF 标头(只要您确切知道格式)。在此处查看它的外观: http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

【讨论】:

我绝对需要输出文件是 WAV(PCM 编码)或 MP3。它被上传到的服务需要这个。所以,据我所知,我不能使用 MediaRecorder。我也是 我绝对需要输出文件是 WAV(PCM 编码)或 MP3。它被上传到的服务需要这个。所以,据我所知,我不能使用 MediaRecorder。我在所有低级的东西上也很糟糕,所以我不知道我自己在创建heade方面会有多好。没有这个能力的java包吗? 我实际上发现了这个:computermusicblog.com/blog/2008/08/29/…,这使得它更容易工作。但我不确定如何获取字节 40 的 datat 块的大小。我将原始 PCM 数据写入文件,那么它只是该文件的大小吗?

以上是关于原始PCM录制与播放的主要内容,如果未能解决你的问题,请参考以下文章

音视频 — AudioRecorder 和 AudioTrack

使用 Android SDK 从原始 PCM 数据创建 WAV 文件

Android录制和播放PCM数据

全志Tina_dolphin播放音视频裸流(h264,pcm)验证

无法在 Android 中播放使用 AudioRecord 录制的 pcm 文件

Android 如何使用 MediaRecorder 录制音频并输出为原始 PCM?