마이크에서 오디오 스트림을 3gpp (AMR-NB)로 인코딩하려고합니다. 문제는 출력 버퍼에 이상한 데이터가 포함되어 있다는 것입니다. 코드와 출력은 다음과 같습니다Android MediaCodec 3gpp 인코더 출력 버퍼에 잘못된 바이트가 포함되어 있습니다.
이만들기 미디어 인코더 : MIC에서
MediaFormat format = MediaFormat.createAudioFormat("audio/3gpp", 8*1024, 1);
format.setInteger(MediaFormat.KEY_BIT_RATE, 8*1024);
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, minBufSize);
MediaCodec encoder = MediaCodec.createEncoderByType("audio/3gpp");
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();
PCM 데이터가 올바른 것 같다 스레드에서 실행, 인코딩 된 바이트 (버퍼를 읽기
(파일로 저장, 대담 경청))
ByteBuffer[] outputBuffers = encoder.getOutputBuffers();
int outputBufferIndex = 0;
while(outputBufferIndex >= 0)
{
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, -1);
if (outputBufferIndex >= 0)
{
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] outData = new byte[bufferInfo.size];
outputBuffer.get(outData);
outputBuffer.clear();
encoder.releaseOutputBuffer(outputBufferIndex, false);
Log.d(LOG_TAG_ENCODING, util.bytesToString(outData));
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
{
outputBuffers = encoder.getOutputBuffers();
}
}
출력은 :
07-11 13:13:58.622: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00
07-11 13:13:58.632: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00
07-11 13:13:58.667: 34 ff d9 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00
07-11 13:13:58.672: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00
07-11 13:13:58.677: 34 6c 1e 08 27 80 05 28 56 40 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00
012,351,
저는 인터넷 검색을하고 도움을받지 못했습니다. 안드로이드는 MediaCodec 사용법에 관한 문서도 훌륭하지 않습니다. OutputBuffer 컨텍스트에서 ByteBuffer.clear()를 사용하면 많은 시행 착오를 겪을 수 있습니다.
최고, Ahti.
버퍼가 전달 될 때'outputBuffer'의 위치와 한계가 올바르게 설정되지 않을 수 있습니다. 'outputBuffer.position (bufferInfo.offset)'및'outputBuffer.limit (bufferInfo.offset + bufferInfo.size)'를 시도하십시오. – fadden