2014-02-07 72 views
1

我試圖將我的攝像頭源編碼到VP8。問題是:當我從輸出緩衝器的幀,字節數組始終是不同的大小,但所有條目都爲0VP8編碼Nexus 5返回空/ 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); 
} 

和Logcat打印:

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()),但似乎沒有任何工作。

奇怪的是,編碼工作在與的CyanogenMod 11的裝置,這也是4.4(嘗試上的S3)

回答

1

MediaCodec不把ByteBuffer在正確的位置。您需要在通話後手動定位它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,但不能解碼。奇怪的是,我的Galaxy Nexus擁有CM11可以編碼和解碼。 –