2

我正在尝试在 4.3 上运行带有 H264 编码器的媒体编解码器 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 ,容量=8],高度=144,mime=video/avc,csd-0=java.nio.ByteArrayBuffer[位置=0,限制=12,容量=12],什么=1869968451,宽度=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):编写器线程已停止

因此,据我所知,它应该可以工作,但看起来编码器仍然没有正确配置......

请指导这...谢谢

内哈尔

4

3 回答 3

3

“编码器输出格式已更改”消息在 Android 4.3 中是正常的。这就是编码器如何为您提供MediaFormat带有 csd-0/csd-1 键的方式,这是MediaMuxer#addTrack().

错误 58834 适用于 VP8 软件编码器;硬件 AVC 编解码器不需要这些补丁。

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

于 2013-09-17T19:34:20.780 回答
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.currentThread()) 直到接收器完成执行并死亡.)

于 2013-09-19T05:37:07.230 回答
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;
        }
    }

这对我来说很有用。

于 2017-02-28T05:15:09.117 回答