- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前有一个用于在 Android 设备上测试音频的环回程序。
它使用 AudioRecord 和 AudioTrack 从 Mic 录制 PCM 音频并从耳机播放 PCM 音频。
代码如下:
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 编解码器实现,我希望能够对来自 Mic 的音频进行编码并将其解码进入 EarPiece,所以我有 encode(short lin[], int offset, byte enc [], int frames) 和 decode(byte enc[], short lin[], int frames) 方法,但我不确定如何使用它们进行编码和解码来自 AudioRecord 和 AudioTrack 的音频。
任何人都可以帮助我或指出正确的方向吗?
最佳答案
更改您的 arec.read(buffer, 0, buffersize)
调用以使用 AudioRecord 中的
。Bytebuffer
read()
方法
将字节放入 ByteBuffer
对象后,您只需插入编码的 G711 实现调用并使用 ByteBuffer.asShortBuffer()
方法来获取您的将 PCM 数据捕获到编码器中。
这将解决您最初的问题,而无需引入第三方库来为您完成这项工作。 (这个答案是为 future 遇到这个问题的人准备的)。
我的问题是为什么?
在上面的代码中,您从麦克风捕获 PCM 数据,并将其直接写入缓冲区以进行播放。
在您的实现中遵循 PCM -> G711(编码)-> G711(解码)-> PCM 的路径没有任何意义。您所做的只是引入不必要的处理和延迟。现在,如果您要将编码数据写入文件而不是尝试通过耳机播放它,那将是另一回事,但您当前的代码似乎对编码 PCM 数据没有多大用处。
只有在将压缩语音数据写入文件(例如以压缩方式记录通话数据)或通过网络发送数据等情况下,在这里引入您自己的编解码器才有意义。
关于java - Android - 如何将我自己的音频编解码器添加到 AudioRecord?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2416365/
我是一名优秀的程序员,十分优秀!