2014-06-09 10 views
3

공식적인 Android 설명서에 따라 MediaCodec 객체를 사용하여 오디오 입력을위한 인코더를 설정했습니다. 그러나 아래 코드의 dequeueOutputBuffer 메서드는 항상 -1을 반환합니다. 이 반환 값의 의미는 무엇입니까?Android MediaCodec dequeueOutputBuffer가 -1을 반환하면 무엇을 의미합니까?

내 코드 :

/*configuarion of MediaCodec object*/ 
codec = MediaCodec.createEncoderByType("audio/mp4a-latm"); 
MediaFormat format = new MediaFormat(); 
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm"); 
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1); 
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); 
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024); 
format.setInteger(MediaFormat.KEY_AAC_PROFILE,MediaCodecInfo.CodecProfileLevel.AACObjectHE); 
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 

codec.start(); 
ByteBuffer[] inputBuffers = codec.getInputBuffers(); 
ByteBuffer[] outputBuffers = codec.getOutputBuffers(); 

/*main loop to encode audio data*/ 
for (;;) { 
    int inputBufferIndex = codec.dequeueInputBuffer(-1); -->this is never zero so data should be written correctly! 
    if (inputBufferIndex >= 0) { 

    // write data from audiorecord in queue 
    inputBuffer = inputBuffers[inputBufferIndex]; 
    inputBuffer.clear(); 

    inputBuffer.put(buf);-->data from audiorecord object 

    encoder.queueInputBuffer(inputBufferIndex, 0, buf.length, 0, 0); 
    codec.queueInputBuffer(inputBufferIndex, ...); 

    } 

    int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);-------->>> "-1" 
    if (outputBufferIndex >= 0) { 

     //do something but never called because outputbufferindex is always -1?? 
+1

데이터가 바로 준비되지 않습니다. 출력이 가능하기 전에 여러 버퍼를 제출해야 할 수도 있습니다. http://bigflake.com/mediacodec/을 참조하십시오. – fadden

+0

buf.length 크기는 무엇입니까? 어떻게 든 인코더에 정상적인 프레임을 보냅니 까? 또한 codec.dequeueOutputBuffer (bufferInfo, 0)를 codec.dequeueOutputBuffer (bufferInfo, 10000)로 변경하십시오. – Marlon

답변

-1

는 지금까지 내 지식이가는대로, 같은 타임 스탬프가 매번 주어진다면, 버퍼는 encoder에 의해 삭제 될 수 있으므로 "encoder.queueInputBuffer"마다의 timestamp 필드를 증가해야합니다.

1

음수가 아닌 값을 전달한 경우 -1을 반환하면 timeoutUSdequeueOutputBuffer에 대한 호출 시간이 초과되었음을 나타냅니다. Android 샘플에 따르면 정수 다음을 반환합니다.

public static final int INFO_TRY_AGAIN_LATER = -1; 
+0

이는 현재 루프의 현재 반복에서 부호기가 사용 중임을 나타냅니다. 인코더가 작업을 완료 할 때까지 기다려야합니다. –

관련 문제