在Android上更改AudioRecord的比特率

用户名

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

这不起作用(例如在这里讨论的示例:在Android中使用8位编码的AudioRecord):

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);
    }
哈特穆特·普菲青格

您需要使用来记录16位样本,AudioFormat.ENCODING_PCM_16BIT因为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://stackoverflow.com/a/18777515/1986583,以获取有用的解释,以了解为什么额外的抖动会改善最终质量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android上更改AudioRecord的比特率

来自分类Dev

Android上的VideoView在比特率更改时重新启动HLS流

来自分类Dev

更改Exo Player的比特率

来自分类Dev

更改Exo Player的比特率

来自分类Dev

比特率JWplayer

来自分类Dev

比特率JWplayer

来自分类Dev

如何在Android中进行流式传输时实时更改MediaCodec编码比特率?

来自分类Dev

更改视频质量和视频比特率

来自分类Dev

如何在Windows 7中更改Bluetooth SBC比特率/比特池?

来自分类Dev

Windows PC上的COM端口指示比特率还是波特率?

来自分类Dev

使用`-b:v 500k`使用ffmpeg降低比特率实际上并没有将比特率降低到500k

来自分类Dev

使用ffmpeg降低视频的比特率

来自分类Dev

ffmpeg与比特率和帧率的差异

来自分类Dev

无法设置音频比特率

来自分类Dev

ffmpeg,音频比特率太大

来自分类Dev

从MKV转换为FLV时,ffmpeg更改音频比特率

来自分类Dev

ffmpeg更改.mp2文件的比特率

来自分类Dev

mmpeg 更改生成文件的比特率和文件大小

来自分类Dev

在使用 Javascript 上传之前更改音频文件的比特率

来自分类Dev

在iOS设备上以编程方式设置HLS流的比特率

来自分类Dev

循环AVPlayer视频流并在每个循环上刷新比特率

来自分类Dev

如何在命令行上使用MediaInfo以--Inform显示我的视频比特率(MBps)

来自分类Dev

如何在Unity面板上显示无线接口比特率?

来自分类Dev

ethtool 可以提供 NIC 上的当前传入比特率吗

来自分类Dev

Android是否支持HLS自适应比特率流传输

来自分类Dev

获取pulseaudio当前采样率和比特率

来自分类Dev

如何在coreaudio中为AudioStreamBasicDescription指定比特率?

来自分类Dev

opencv-录像机控制比特率

来自分类Dev

me脚-将比特率提高到320

Related 相关文章

热门标签

归档