2014-02-07 39 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可以编码和解码。 –