Android- 오디오 코덱을 Audiorecord에 추가하는 방법은 무엇입니까?
문제
현재 Android 장치에서 오디오 테스트를위한 루프 백 프로그램이 있습니다.
Audiorecord 및 Audiotrack을 사용하여 마이크에서 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 Codec 구현을 가지고 있으며 마이크에서 오디오를 인코딩하고 이어 피스로 들어가는 것을 디코딩 할 수 있기를 원합니다. Encode (short lin [], int 오프셋, 바이트 enc [], int 프레임) 그리고 decode (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를 사용하여 호출하는 것입니다.