android - VP8 编码 Nexus 5 返回空/0 帧

标签 android android-4.4-kitkat android-mediacodec vp8 nexus-5

我正在尝试将我的相机输入编码为 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/

相关文章:

android - 在 Windows 8 64 位上安装 Nexus 4(带 KitKat)的 USB 驱动程序 - "no compatible software driver"

android - setColorFilter 似乎不适用于 kitkat

android - 将视频从 Android 应用程序导出到 SD 卡

android - 用于音频的 MediaExtractor,得到意外的音频

java - 如何使用 Java 代码设置 TextView 的位置?

android - 哪个fb ://url is suitable to trigger the FB application prompting to share content?

android - Adobe AIR/Flash Builder 4.6 : Create reminder in Android App

java - Android 4.4 SDK 更新后 android-support-v7-appcombat jar 不匹配和应用程序崩溃

android - MediaCodec - 将 EOS 缓冲区发送到音频解码器时出现奇怪的错误

android - 在 ListView 适配器中从我的应用程序打开电子邮件应用程序