如何提取部分录制的音频字节

How to extract part of recorded audio bytes

我录音到字节数组,见下:

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    recorder.setAudioSamplingRate(44100);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setAudioEncodingBitRate(1024*1024);

...

    while (hasRecording) {
        try {
            int read = inputStream.read(data, 0, data.length);
            if (read == -1)
                break;

            byteArrayOutputStream.write(data, 0, read);
            byteArrayOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

通过记录,我正在将振幅绘制到图表中(即时)。停止记录后用户可以 select 部分图表。现在,我如何提取用户 selection 的部分字节数组?我只有位置 selected 坐标和完整录制声音的字节数组。 我知道,我必须使用比特率来计算字节数组中的位置,但我不知道如何计算。

谢谢。

如果数组大小为 N 且包含 T 秒的音频数据(从 t=0 到 t=T),则时间 t 的数据将位于索引 t*N/T.

你能确定每帧的字节数吗?我可以看到你每秒有 44100 帧。但我通常不会在比特率方面处理音频,也不清楚这与什么有关。

在纯 Java 上下文中,AudioFormat 是根据用于编码的位来定义的,最常见的是 16 位(两个字节),通道数,例如,1 个通道用于单声道,2 个通道用于立体声。

对于所谓的常见“CD 质量”格式,我们有 16 位编码和立体声,因此每帧 4 个字节。从那个和帧速率来看,将特定字节与某个时刻相关联是一件简单的事情。