我正在尝试将我的相机输入编码为 VP8。问题是:当我从输出缓冲区获取帧时,字节数组始终大小不同,但所有条目均为 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 上尝试过)
最佳答案
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()
不同,尽管我有点惊讶它不起作用——我预计输出通常会从缓冲区的开头。
VP8 存在一些已知问题在 Android 4.3 上,尽管您似乎没有达到这些要求。
如果这不能解决您的问题,了解您正在使用的设备(适用于 Android 和 Cyanogen 的 S3?)、Android 软件版本以及查看您用于 的代码将会很有帮助configure()
MediaCodec
,以及使用哪些值。
关于android - VP8 编码 Nexus 5 返回空/0 帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21626156/