Audio PCM

come from :   https://blog.youkuaiyun.com/shuyong1999/article/details/7165419

PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV格式的文件。   

     将音频数字化,其实就是将声音数字化。最常见的方式是透过脉冲编码调制PCM(Pulse Code Modulation) 。运作原理如下。首先我们考虑声音经过麦克风,转换成一连串电压变化的信号,如图一所示。这张图的横座标为秒,纵座标为电压大小。要将这样的信号转为 PCM 格式的方法,是使用三个参数来表示声音,它们是:声道数、采样位数和采样频率。

     采样频率:即取样频率,指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前的常用采样频率都不超过48KHz。

       采样位数:即采样值或取样值(就是将采样样本幅度量化)。它是用来衡量声音波动变化的一个参数,也可以说是声卡的分辨率。它的数值越大,分辨率也就越高,所发出声音的能力越强。

        声道数:很好理解,有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音),立体声的pcm可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果。

 

  下面再用图解来看看采样位数和采样频率的概念。让我们来看看这几幅图。图中的黑色曲线表示的是pcm文件录制的自然界的声波,红色曲线表示的是pcm文件输出的声波,横坐标便是采样频率;纵坐标便是采样位数。这几幅图中的格子从左到右,逐渐加密,先是加大横坐标的密度,然后加大纵坐标的密度。显然,当横坐标的单位越小即两个采样时刻的间隔越小,则越有利于保持原始声音的真实情况,换句话说,采样的频率越大则音质越有保证;同理,当纵坐标的单位越小则越有利于音质的提高,即采样的位数越大越好。

    在计算机中采样位数一般有8位和16位之分,但有一点请大家注意,8位不是说把纵坐标分成8份,而是分成2的8次方即256份; 同理16位是把纵坐标分成2的16次方65536份; 而采样频率一般有11025HZ(11KHz),22050HZ(22KHz)、44100Hz(44KHz)三种。

  样点 t1 t2 t3 t4 t5 t6 t7 ...  t16 t17 t18 t19 t20

幅值 0011 01010111 1001 1011 1101 1110 ... 0110 0110 0101 0011 0000

         那么,现在我们就可以得到pcm文件所占容量的公式:

     存储量=(采样频率*采样位数*声道)*时间/8(单位:字节数)

 

                   波形声音的码率 = 取样频率 × 量化位数 × 声道数

 

 

  例如,数字激光唱盘(CD-DA,红皮书标准)的标准采样频率为44.lkHz,采样数位为16位,立体声(2声道),可以几乎无失真地播出频率高达22kHz的声音,这也是人类所能听到的最高频率声音。激光唱盘一分钟音乐需要的存储量为:     

     (44.1*1000*l6*2)*60/8=10,584,000(字节)=10.584MBytes

这个数值就是pcm声音文件在硬盘中所占磁盘空间的存储量。

 

  计算机音频文件的格式决定了其声音的品质,日常生活中电话、收音机等均为模拟音频信号,即不存在采样频率和采样位数的概念,我们可以这样比较一下:

         44KHz,16BIT的声音称作:CD音质;

         22KHz、16Bit的声音效果近似于立体声(FM Stereo)广播,称作:广播音质;

         11kHz、8Bit的声音,称作:电话音质。

         微软的WAV文件就是pcm编码的一种

<think>首先,用户的问题是:“请问Android平台如何进行音频PCM数据的采集与转储”。我需要根据系统级指令来回答。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考的引用: - 引用[1]: 关于Android直播平台中PCM数据采集与处理。 - 引用[2]: 音视频开发二:Android平台PCM数据的采集,介绍了AudioRecord。 - 引用[3]: Android开发之PCM音频采集,展示了一个代码实例。 用户意图是获取在Android平台上进行音频PCM数据采集与转储的方法或工具。 回答结构: - 我需要结构清晰,逐步引导用户。 - 首先解释什么是PCM数据。 - 然后介绍采集方法,使用AudioRecord API。 - 接着展示如何转储数据到文件。 - 最后,生成相关问题。 关键点: - 采集PCM数据:使用Android的AudioRecord类。 - 转储:将采集到的数据写入文件。 - 参考引用中的代码片段。 步骤: 1. 介绍PCM数据。 2. 解释AudioRecord API。 3. 提供代码示例。 4. 解释如何转储数据。 5. 生成相关问题。 确保使用中文。</think>### Android平台音频PCM数据采集与转储方法 在Android平台上,PCM(Pulse-Code Modulation)是一种未经压缩的原始音频数据格式,广泛应用于音视频处理领域。采集和转储PCM数据主要通过Android SDK提供的`AudioRecord` API实现,该API允许开发者直接访问麦克风输入并获取原始音频帧。以下是详细步骤和方法: #### 1. **理解PCM数据采集基础** - PCM数据表示音频信号的离散采样值,每个采样点对应一个量化值(通常为16-bit整数)。 - 采集参数包括: - 采样率(Sample Rate):如$44100 \text{Hz}$(标准CD音质)。 - 声道配置(Channel Config):如`CHANNEL_IN_MONO`(单声道)或`CHANNEL_IN_STEREO`(立体声)。 - 音频格式(Audio Format):如`ENCODING_PCM_16BIT`(16-bit PCM)。 - `AudioRecord`是底层API,相比`MediaRecorder`(支持压缩编码),它提供更灵活的控制,适合需要原始数据的场景[^2]。 #### 2. **采集PCM数据步骤** - **初始化AudioRecord**:设置音频参数并创建实例。 - **启动采集**:调用`startRecording()`方法开始录音。 - **读取数据**:循环调用`read()`方法获取PCM帧数据。 - **停止采集**:调用`stop()`释放资源。 参考以下代码示例(基于引用[2]和[3]): ```java import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class PCMRecorder { private static final int SAMPLE_RATE = 44100; // 采样率 private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO; // 单声道 private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; // 16-bit PCM private AudioRecord audioRecord; private boolean isRecording = false; public void startRecording() { // 计算最小缓冲区大小 int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT); audioRecord = new AudioRecord( MediaRecorder.AudioSource.MIC, // 麦克风输入源 SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, minBufferSize * 2 // 缓冲区大小(推荐2倍最小值) ); audioRecord.startRecording(); isRecording = true; // 创建线程循环读取数据 new Thread(() -> { byte[] buffer = new byte[minBufferSize]; while (isRecording) { int bytesRead = audioRecord.read(buffer, 0, buffer.length); if (bytesRead > 0) { // 处理或转储数据(见步骤3) dumpToFile(buffer, bytesRead); } } }).start(); } public void stopRecording() { isRecording = false; if (audioRecord != null) { audioRecord.stop(); audioRecord.release(); audioRecord = null; } } } ``` #### 3. **转储PCM数据到文件** - **文件写入**:在读取数据后,将字节数组写入文件。PCM文件通常以`.pcm`或`.raw`为后缀。 - **转储方法**:在`dumpToFile`方法中实现文件操作。 ```java import java.io.FileOutputStream; import java.io.IOException; private void dumpToFile(byte[] data, int size) { try (FileOutputStream fos = new FileOutputStream("sdcard/audio.pcm", true)) { // 追加模式 fos.write(data, 0, size); } catch (IOException e) { e.printStackTrace(); } } ``` - **文件查看与播放**: - PCM文件是原始数据,需专用工具查看(如Audacity或FFmpeg)。 - 在Audacity中导入时,选择“原始数据”并指定参数(采样率$44100 \text{Hz}$, 16-bit, 单声道)。 - 命令行播放:`ffplay -f s16le -ar 44100 -ac 1 audio.pcm`[^1]。 #### 4. **注意事项** - **权限要求**:在`AndroidManifest.xml`中添加录音权限: ```xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> ``` - **性能优化**:避免在主线程操作,使用后台线程读取数据,防止ANR(应用无响应)。 - **数据完整性**:确保缓冲区大小足够(使用`getMinBufferSize()`计算),避免数据丢失。 - **兼容性**:测试不同Android版本,`AudioRecord`在API Level 3+支持。 通过以上方法,您可以高效采集和转储PCM数据,适用于实时音频处理、直播推流或音视频分析等场景[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值