带有Input as Surface的Media Codec API不能与H264编码器一起使用(bigflake示例代码)

时间:2013-09-17 14:59:31

标签: android-4.3-jelly-bean mediacodec muxer

我正在尝试运行带有H264 Encoder的Media Codec API的示例代码,在以下的bigflake链接中进行了解释

http://bigflake.com/mediacodec/CameraToMpegTest.java.txt

我遇到了以下问题。 - >在H264编码器代码中,颜色格式,高度和宽度没有得到更新,因为getpatameter实现中存在问题。所以我应用了这个补丁(https://code.google.com/p/android/issues/detail?id=58834)。 - >应用补丁后,编码器也不编码 - >我看过像这样的观察 D / CameraToMpegTest(3421):编码器输出格式已更改:{csd-1 = java.nio.ByteArrayBuffer [position = 0,limit = 8,capacity = 8],height = 144,mime = video / avc,csd-0 = java.nio.ByteArrayBuffer [position = 0,limit = 12,capacity = 12],what = 1869968451,width = 176}

为什么这个价值会发生变化,不知道...... 之后我们总是看到编码器将queueOutputBuffer的状态设置为INFO_TRY_AGAIN_LATER。 所以它创建了文件,但它没有编码任何东西,它停止为

I / MPEG4Writer(3421):接收总/ 0长度(0/0)缓冲区并编码0帧。 - 视频

D / MPEG4Writer(3421):停止视频轨道

D / MPEG4Writer(3421):停止视频轨道源

D / MPEG4Writer(3421):视频轨道已停止

D / MPEG4Writer(3421):停止编写器线程

D / MPEG4Writer(3421):在最后一批中写入0个块

D / MPEG4Writer(3421):写入程序线程已停止

所以在我的理解中它应该可以工作,但看起来仍然编码器没有正确配置...

请指导一下...... 感谢

Nehal

3 个答案:

答案 0 :(得分:2)

Android 4.3中的“编码器输出格式已更改”消息正常。这就是编码器为MediaFormat提供MediaMuxer#addTrack() csd-0 / csd-1密钥的方法,INFO_TRY_AGAIN_LATER

Bug 58834用于VP8软件编码器;硬件AVC编解码器不应该需要这些补丁。

VERBOSE最常见的原因是缺乏输入。编码器可能会在产生任何输出之前排队相当数量的输入帧,因此您不能只提交一帧然后等待输出出现。打开{{1}}标志,确保正在提交框架。

答案 1 :(得分:1)

我尝试在Android 4.3模拟器上运行CameraToMpegTest示例。正如你现在已经意识到的那样,它不会按原样运行,并且需要一些修复。

  1. 在SoftAVCEncoder中正确实现getparameter(如果是MIME类型 - “video / avc”),请参阅宽度,高度,颜色格式等参数。否则,您的MediaFormat配置不正确,createInputSurface将失败。 (我不确定为什么在使用Mediarecorder运行H.264编码时不会出现任何问题)

  2. 修复EGL属性

  3. 最重要的是,如果您尝试在Activity上下文中执行此代码,请确保不要阻止onFrameAvailable回调 (final void join() 阻止当前Thread(Thread.currentThread())直到接收者完成执行并死亡。)

答案 2 :(得分:0)

作为代码段,您应该删除th.join();

    /** Entry point. */
    public static void runTest(CameraToMpegTest obj) throws Throwable {
        CameraToMpegWrapper wrapper = new CameraToMpegWrapper(obj);
        Thread th = new Thread(wrapper, "codec test");
        th.start();
    //    th.join();
        if (wrapper.mThrowable != null) {
            throw wrapper.mThrowable;
        }
    }

它适用于我。