【问题标题】:MediaCodec Encoded video has green bar at bottom and chrominance screwed upMediaCodec 编码的视频底部有绿色条,色度搞砸了
【发布时间】:2016-01-22 19:43:47
【问题描述】:

我从Grafika 开始了一个项目并对其进行了修改。我有一个框架(与原始框架没有太大区别),它从Camera 捕获预览,并同时以不同的分辨率将其连续编码为视频。

MediaCodec(用于编码)配置为使用 COLOR_FormatSurface,以便我们能够使用 GLES 渲染到使用 getInputSurface() 查询的 Surface。

媒体格式设置为 MIME Type video/avc

对于大多数手机来说,这种设置非常有效。

但对于一些手机,编码后的视频的色度值略微倾斜,底部有一个绿色条。

目前编码器表面的分辨率为 640x360。 选择渲染到表面的 EGLConfig 支持 32 位 RGBA 格式。

预览完美适用于所有手机。

所以我假设在应用程序端或操作系统框架端的编码器参数有问题。

这发生在 Android 4.4 上。 - 不确定,是否可以在 5.* 上重现。

]2

【问题讨论】:

  • 这看起来像是颜色格式问题,从 Surface 编码时不应该发生这种情况。您可以尝试其他分辨率吗?我很好奇这些设备上的编解码器在该分辨率下是否存在错误。您知道是否所有受影响的设备都具有相同的视频编码器芯片? (你通常可以通过查看 logcat 来判断——通常会有一些特定于硬件的喋喋不休。)
  • 通常预览分辨率和编码分辨率不同。 640x360 也是编码分辨率吗?你在编码1080p吗?如果是这样,那么我认为您的问题是由于垂直对齐。编码器可能正在读取 1088 而不是 1080。如果是这样,相机输出应该类似地对齐。
  • 预览为 720p。没关系。因为我将它作为纹理(使用 OpenGLES)渲染到编码器表面。 @fadden 已经指出了这个问题。看起来像编解码器问题。我现在使用高度为 16 的下一个倍数的 Surface。
  • @Ganesh:对不起,我想我没有正确解释这个问题。相机预览:720p,设备预览分辨率:设备分辨率,编码器分辨率:360p,问题是 youtube 直播 API 仅支持这些分辨率:Livestreaming supported resolutions 我应该只使用高度 368 而不是 360?问题是宽高比被破坏了,youtube 会在两边添加一些空白。
  • 您不是唯一遇到联发科问题的人(例如stackoverflow.com/questions/34891420)。您是否检查了 MediaCodecInfo.CodecProfileLevel 以确认设备宣传支持 1080p?许多设备都有一个“秘密”的 16 倍数要求,但无论如何都能正确处理 1080。

标签: android encoding opengl-es android-mediacodec grafika


【解决方案1】:

我会自己回答,以防其他人觉得它有用。

显然,该问题仅出现在少数精选芯片组上,例如 MediaTek 不支持非 16 的倍数分辨率。就我而言,它是 640x360(高度是 8 的倍数)。为了部分解决它,我在 App 代码中添加了一个检查,如果编码器是 Omx.mtk,然后将编码器的宽度/高度重新配置为next multiple of 16,结果是 640x368 in我的情况(最接近要求,即 360p)。

对我来说,YouTube 播放器在两侧添加了一个轻微的空白,这是我们可以使用这些编码器做的最好的事情。

如果您不依赖任何第三方 API/播放器等

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 2012-09-20
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多