Android-如何将自己的音频编解码器添加到Audiorecord?
题
我目前有一个循环返回程序,用于在Android设备上测试音频。
它使用Audiorecord和Audiotrack从麦克风中录制PCM音频,并播放PCM Audio听筒。
这是代码:
public class Record extends Thread
{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority
(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize);
atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
}
}
因此,正如您在创建Audiotrack和Audiorecord时看到的那样,编码是通过AudioFormat提供的,但这仅允许16位或8位PCM。
我现在有自己的G711编解码器实现,我希望能够从麦克风中编码音频并将其解码为耳机,所以我有 编码(简短lin [],int offset,byte enc [],int帧) 和 解码(byte enc [],short lin [],int帧) 方法,但我不确定如何使用它们对Audiorecord和audiotrack的音频进行编码和解码。
谁能帮助我或指向正确的方向?
解决方案
改变你的 arec.read(buffer, 0, buffersize)
打电话使用 Bytebuffer
read()
方法 AudioRecord
.
一旦您将字节带入 ByteBuffer
对象,然后您只需插入g711实现编码的呼叫,然后使用 ByteBuffer.asShortBuffer()
将捕获的PCM数据输入编码器的方法。
这将解决您的最初问题,而无需介绍第三方库为您做这项工作。 (这个答案是针对遇到问题的未来人)。
我的问题是为什么?
在上面的代码中,您从麦克风捕获PCM数据,然后将其直接写入缓冲区以进行播放。
遵循PCM-> g711(encode) - > g711(Decode) - > pcm的路径,实现无意义。您所做的只是引入不必要的处理和延迟。现在,如果您打算将编码的数据写入文件,而不是尝试通过耳朵片段播放,那将是另一个故事,但是您当前的代码似乎并不是对PCM数据的编码并不是很有用。
在此处介绍您自己的编解码器只有在将压缩语音数据写入文件(例如以压缩方式记录呼叫数据)或通过网络或其他内容发送的上下文中才有意义。
其他提示
我意识到这是一个很古老的帖子。您能使自己的G711工作吗?我自己的最初想法是使用编译的LIB为内核,并使用JNI称呼它。