2014-02-07 2 views
1

카메라 피드를 VP8로 인코딩하려고합니다. 문제는 : 내가 출력 버퍼에서 프레임을 얻을 때, 바이트 배열이 다른 크기는 항상 있지만, 모든 항목이 여기에VP8 인코딩 Nexus 5에서 빈/0 프레임이 반환됩니다.

0 내가 프레임을 잡고 그것을 인쇄 코드의 위치 :

while (true) { 
    try { 
     encoderIndex = mEncoder.dequeueOutputBuffer(encoderOutputInfo, timeOut); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    switch (encoderIndex) { 
    case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: 
     // something 
     break; 
    case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: 
     // something else 
     break; 
    case MediaCodec.INFO_TRY_AGAIN_LATER: 
     // something completely different 
     break; 
    default: 
     // get encoded frame 
     byte[] frame = new byte[encoderOutputInfo.size]; 

     mEncoderOutputBuffers[encoderIndex].get(frame); 

     Log.v(tag, "got frame. size: " + frame.length); 
     Log.v(tag, "printing frame"); 
     Log.v(tag, printBytesAsBinary(frame)); 

     mEncoderOutputBuffers[encoderIndex].clear(); 

     // release encoder output buffer 
     mEncoder.releaseOutputBuffer(encoderIndex, false); 
} 

그리고 로그 캣 인쇄 :

02-07 11:48:19.014: V/GoogleEncoder(24883): got frame. size: 427 
02-07 11:48:19.014: V/GoogleEncoder(24883): printing frame 
02-07 11:48:19.014: V/GoogleEncoder(24883): 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
02-07 11:48:20.544: V/GoogleEncoder(24883): got frame. size: 379 
02-07 11:48:20.544: V/GoogleEncoder(24883): printing frame 
02-07 11:48:20.544: V/GoogleEncoder(24883): 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

누구나 이미이 문제가 있었고 내가 잘못하고있는 것을 말해 줄 수 있습니까? 나는 이미 출력 버퍼 (예 : rewind())를 망치려고했지만 아무 것도 작동하지 않는 것 같습니다.

이상하게 부호화 올바른 위치에 ByteBuffer 넣지 않고 (a 입어 S3)도 4.4이다 (11) 사이 애 노젠 모드 장치

답변

1

MediaCodec 작동. 당신은 dequeueOutputBuffer()에 호출 후 수동으로 배치해야합니다

int encoderStatus = encoder.dequeueOutputBuffer(info, TIMEOUT_USEC); 
... 
ByteBuffer encodedData = encoderOutputBuffers[encoderStatus]; 
encodedData.position(info.offset); 
encodedData.limit(info.offset + info.size); 

(EncodeDecodeTest를 참조하십시오.) 그건 내가 좀 놀랍군요하지만 그 작동하지 않았다, rewind() 같은 아니에요 - 내가 것으로 예상했을 것이다 출력은 일반적으로 버퍼의 시작에서 시작됩니다.

Android 4.3에는 VP8과 관련하여 몇 가지 알려진 문제가 있지만 그 중 하나가 아닌 것으로 보입니다.

그래도 문제가 해결되지 않으면 사용중인 기기 (Android 및 Cyanogen의 경우 S3), Android 소프트웨어 버전을 확인한 후 configure()에 사용중인 코드를 확인하는 것이 도움이됩니다. MediaCodec 및 사용 된 값

+0

도움 주셔서 감사합니다. 수동으로 버퍼의 오프셋과 한계를 설정하면 문제가 해결되었습니다. 4.4.2 Nexus 5에서 작동합니다. 인코딩은 CM11 S3 및 S1에서도 작동하지만 디코딩에서는 작동하지 않습니다. 이상하게도 CM11을 사용하는 Galaxy Nexus는 인코딩 및 해독 할 수 있습니다. –

관련 문제