Java Android-如何将我自己的音频编解码器添加到AudioRecord?
我目前有一个在Android设备上测试音频的环回程序 它使用AudioRecord和AudioTrack从麦克风录制PCM音频,并通过耳机播放PCM音频 代码如下:Java Android-如何将我自己的音频编解码器添加到AudioRecord?,java,android,audio,encode,codec,Java,Android,Audio,Encode,Codec,我目前有一个在Android设备上测试音频的环回程序 它使用AudioRecord和AudioTrack从麦克风录制PCM音频,并通过耳机播放PCM音频 代码如下: public class Record extends Thread { static final int bufferSize = 200000; final short[] buffer = new short[bufferSize]; short[] readB
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,字节enc[],int frames)和解码(字节enc[],短lin[],int frames)方法,但我不确定如何使用它们对录音和音轨中的音频进行编码和解码
有谁能帮我或给我指出正确的方向吗?我意识到这是一篇很老的帖子。你能让自己的G711正常工作吗?我自己最初的想法是使用为内核编译的lib,并使用JNI来调用它。将您的
arec.read(buffer,0,buffersize)
调用更改为使用Bytebuffer
的read()
方法
将字节放入ByteBuffer
对象后,您只需插入encode的G711实现调用,并使用ByteBuffer.asShortBuffer()
方法将捕获的PCM数据放入编码器
这将解决您最初的问题,而无需引入第三方库来为您完成这项工作。(这个答案适用于未来遇到这个问题的人)
我的问题是为什么
在上面的代码中,您从麦克风捕获PCM数据,并将其直接写入缓冲区进行播放
在您的实现中,遵循PCM->G711(编码)->G711(解码)->PCM的路径没有任何意义。您所做的只是引入不必要的处理和延迟。现在,如果您打算将编码数据写入一个文件,而不是试图通过耳机播放它,那将是一个不同的故事,但是您当前的代码似乎对编码PCM数据没有真正的用处
在这里介绍您自己的编解码器只有在将压缩语音数据写入文件(例如以压缩方式记录通话数据)或通过网络或其他方式发送时才有意义。请对此类问题的原始问题发表评论。在了解更多细节之前,不要创建答案。祝你好运!:)嗨,克里斯,我确实使用了第三方库来实现这一点。嗨,多纳尔,你能用你所做的最终实现来更新这个问题吗?几天来,我一直试图在G711中编码/解码,但没有成功。如果我们能看到你是怎么做的,那就太好了……我在这个问题上遇到了很多问题。谢谢Shi Juan,恐怕我已经没有最终的解决方案了,这是我早已离开的一个项目的一部分,我不再有或能够记住解决方案的代码,抱歉。