【问题标题】:Media Codec API with Input as Surface not working with H264 encoder (bigflake example code)输入为 Surface 的媒体编解码器 API 无法与 H264 编码器一起使用(bigflake 示例代码)
【发布时间】:2013-09-17 14:59:30
【问题描述】:

我正在尝试在 4.3 上使用 H264 编码器运行 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): 写入器线程停止

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

请指导... 谢谢

尼尔

【问题讨论】:

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


    【解决方案1】:

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

    错误 58834 是针对 VP8 软件编码器的;硬件 AVC 编解码器不需要这些补丁。

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

    【讨论】:

    • 感谢您提供的信息。但是,csd-0/csd-1 消息显示不同的高度和宽度以及比特率,然后是我们设置的。另外在这里我正在尝试软件 AVC,所以你知道需要任何其他修复。关于帧队列,我会检查并随时通知您。如果您有媒体编解码器的工作示例代码来分享,那也很棒。
    • bigflake.com 上的代码是我的。编码器的大小和颜色格式在格式传递给configure()时设置;在此之后更改 MediaFormat 对象不会有任何效果。如果您在调用 MediaCodec#configure() 之前立即记录格式,您应该会看到与稍后看到的相同的尺寸。
    • 嗨 Fadeen 我正在模拟器上尝试这个例子。特此我已经粘贴了我的代码。我已经更改了 egl 参数,因为它不能直接在模拟器上工作。但是,我可以看到来自相机的帧,但没有调用 onfrmaeavailable ......另外,如果只是忽略这个事实,假设编码器仍然有可用的空白帧它不编码...请在下面找到代码
    • 我已从 stackoverflow.com/questions/11372863/… 对 EGL 配置进行了更改
    • 我强烈建议将物理设备用于媒体内容。我没有在模拟器上尝试过任何示例。
    【解决方案2】:

    我尝试在 Android 4.3 模拟器上运行 CameraToMpegTest 示例。正如您现在已经意识到的那样,它无法按原样工作,需要进行一些修复。

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

    2. 修复 EGL 属性

    3. 最重要的是,如果您尝试在 Activity 上下文中执行此代码,请确保您没有阻塞 onFrameAvailable 回调 (最终无效加入() 阻塞当前线程(Thread.currentThread()),直到接收者完成执行并死亡。)

    【讨论】:

      【解决方案3】:

      作为代码sn-p,你应该删除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;
              }
          }
      

      它对我很有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 2015-05-14
        • 2012-08-19
        • 2022-10-20
        相关资源
        最近更新 更多