【发布时间】:2021-06-25 07:45:50
【问题描述】:
我正在尝试通过蓝牙设备录制音频流。我正在使用蓝牙 SCO 获取蓝牙音频和 AudioRecord 类来录制音频。
我正在使用 MONO 通道以 16000 的采样率录制 RAW .PCM 文件
我正在像这样计算 BufferSize
private static final int BUFFER_SIZE_FACTOR = 2;
private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLING_RATE_IN_HZ,CHANNEL_CONFIG, AUDIO_FORMAT) * BUFFER_SIZE_FACTOR;
这就是我目前获取/写入音频的方式,
private class RecordingRunnable implements Runnable {
@Override
public void run() {
setFileNameAndPath();
final ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER_SIZE);
try (final FileOutputStream outStream = new FileOutputStream(mFilePath)) {
while (recordingInProgress.get()) {
int result = recorder.read(buffer, BUFFER_SIZE);
if (result < 0) {
throw new RuntimeException("Reading of audio buffer failed: " +
getBufferReadFailureReason(result));
}
outStream.write(buffer.array(), 0, BUFFER_SIZE);
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Writing of recorded audio failed", e);
}
}
我做了一点研究,发现剪裁效果可能是因为错误的字节顺序(LITTLE_ENDIAN or BIG_ENDIAN) 或因为糟糕的多线程。但是在当前的实现中,我无法理解字节是如何排序和保存的,以及我可以做些什么来解决剪辑/噪声问题。
我正在启动我的记录器,像这样运行
recordingThread = new Thread(new RecordingRunnable(), "Recording Thread");
recordingThread.start();
recordingThread.setPriority(Thread.MAX_PRIORITY);
【问题讨论】:
标签: java android bytebuffer audiorecord android-audiorecord