【问题标题】:Muxing camera preview h264 encoded elementary stream with MediaMuxer使用 MediaMuxer 混合相机预览 h264 编码的基本流
【发布时间】:2013-10-14 13:48:27
【问题描述】:

我正在使用 Android 4.3 的新 MediaCodec 和 MediaMuxer API 实现有关 previewTexture 录制的Android Test Cases 之一。

通过将 recordingHint 设置为相机参数,我设法以大约 30fps 的帧速率记录预览流。

但是,我遇到了延迟/滞后问题,不知道如何解决。当使用相当标准的质量设置(1280x720,比特率约为 8.000.000)录制相机预览时,预览和编码材料偶尔会出现延迟。更具体地说:这种延迟大约每 2-3 秒发生一次,大约需要 300-600 毫秒。

通过跟踪延迟,我发现延迟来自“drainEncoder”方法中的以下代码行:

mMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo);

如果编码器有可用于复用的数据,则循环调用此行。目前我不录制音频,所以只有 h264 流由 MediaMuxer 转换为 mp4 格式。

我不知道这是否与延迟有关,但它总是在循环需要两次迭代以使编码器的所有可用数据出列时发生(更具体地说,它总是发生在其中的第一个两次迭代)。在大多数情况下,一次迭代就足以使编码器出队。

由于没有太多关于这些新 API 的在线信息,非常感谢任何帮助!

【问题讨论】:

    标签: android camera preview android-mediacodec


    【解决方案1】:

    我怀疑您被MediaMuxer 磁盘写入所困扰。最好的确定方法是在录制期间运行 systrace 并查看暂停期间实际发生的情况。 (systrace docsexplanationbigflake example -- 目前只有后者针对 Android 4.3 进行了更新)

    如果是这种情况,您可以通过在单独的线程上运行 MediaMuxer 实例并通过同步队列将 H.264 数据提供给它来缓解问题。

    这些暂停是否定期发生,每 5 秒一次? CameraToMpegTest 示例将编码器配置为每 5 秒输出一个 I 帧(预期帧速率为 30fps),这导致输出全尺寸帧而不是微小的增量。

    【讨论】:

    • 非常感谢您的回复:- 延迟确实每 5 秒发生一次。但是当我改变 I-Frame 间隔时频率不会改变。最好的猜测是我的编码器(Nexus 4)忽略了自定义 I 帧间隔? - 我昨天已经开始尝试在一个单独的线程中分离复用,这似乎有效......所以我会那样做,感谢您的确认! - 只要我有足够的时间,我就会系统跟踪延迟
    【解决方案2】:

    正如@fadden 所指出的,这是一个磁盘写入问题,主要发生在写入闪存速度较低的设备上,或者您尝试写入 SD 卡时。

    我在类似的问题here 中写了一个关于如何缓冲 MediaMuxer 写入的解决方案。

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2012-04-01
      • 2015-04-25
      • 2013-09-22
      • 1970-01-01
      • 2019-12-31
      相关资源
      最近更新 更多