如何提取部分录制的音频字节
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 个字节。从那个和帧速率来看,将特定字节与某个时刻相关联是一件简单的事情。
我录音到字节数组,见下:
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 个字节。从那个和帧速率来看,将特定字节与某个时刻相关联是一件简单的事情。