在 Android 上更改 AudioRecord 的比特率

Posted

技术标签:

【中文标题】在 Android 上更改 AudioRecord 的比特率【英文标题】:Change Bitrate of AudioRecord on Android 【发布时间】:2014-05-19 10:59:48 【问题描述】:

android 上,以 wav 格式录制时,如何在 AudioRecord 对象中将每个样本的位数从 16 位更改为 8 位(或其他比特率)?

这不起作用(例如在这里讨论:Using AudioRecord with 8-bit encoding in android):

private static int RECORDER_AUDIO_ENCODING = 
         AudioFormat.ENCODING_PCM_8BIT; -->ERROR: Invalid Audio Format.
bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,
         RECORDER_AUDIO_ENCODING);
recorder = new AudioRecord(MediaRecorder.Audiosource.MIC,RECORDER_SAMPLERATE, 
         RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);

带有标题:

private void WriteWaveFileHeader(
        FileOutputStream out, long totalAudioLen,
        long totalDataLen, long longSampleRate, int channels,
        long byteRate) throws IOException 

        byte[] header = new byte[44];

        header[0] = 'R';  // RIFF/WAVE header
        ...header content...
        header[32] = (byte) (2 * 16 / 8);  // block align
        header[33] = 0;
        header[34] = (byte)RECORDER_BPP;  // bits per sample, set to 8
        ...header content...

        out.write(header, 0, 44);
    

【问题讨论】:

【参考方案1】:

您需要使用AudioFormat.ENCODING_PCM_16BIT 记录 16 位样本,因为 8 位编码通常不适用于 Android 设备。

然后将您的 16 位缓冲区动态转换为 8 位,然后再将其写入波形声音文件。但是因为 8 位波形文件使用无符号整数 (0-255),静音为 128 而不是 0,所以我建议的转换可以纠正这一点。以下只是一个代码骨架:

// Your source above already defined a value for bufferSize and the recorder object
sampleBufferShorts = new short[bufferSize];
sampleBufferBytes = new short[bufferSize];
int numberOfShortsRead = recorder.read(samleBufferShorts, 0, bufferSize);
if (numberOfShortsRead != ERROR_INVALID_OPERATION && numberOfShortsRead != ERROR_BAD_VALUE) 
    for (int i = 0 ; i < numberOfShortsRead ; ++i)
        sampleBufferBytes[i] = (byte)((sampleBufferShorts[i]>>8)+128);

请参阅https://***.com/a/18777515/1986583 了解为什么额外的抖动会提高最终质量的有用解释。

【讨论】:

您建议的版本和(如果可行的话)直接 Android 8 位编码之间的输出有什么不同吗? 是的,AudioFormat.ENCODING_PCM_8BIT 的 8 位值 0 表示静音,127 是最大值,-128 是最小值。我的代码中的“+128”更改了这些值,以便它们适合波形文件格式。如果您打算在读取之后但写入之前处理字节,我建议在将数据保存到 wav 文件之前立即执行“+128”。【参考方案2】:

不可能,您必须对 .wav 文件进行后处理。

【讨论】:

以上是关于在 Android 上更改 AudioRecord 的比特率的主要内容,如果未能解决你的问题,请参考以下文章

Android 调用未初始化的 AudioRecord 错误

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

AudioRecord 文件有点大

无法在 Android 中使用 AudioRecord 进行录制

Android 音频录制-AudioRecord

Android AudioRecord 问题?