MediaCodec编码的视频底部有绿色条纹且色度失真。

5
我从Grafika开始了一个项目,并进行了修改。 我有一个框架(与原始框架相比并不太不同),它捕获来自Camera的预览,并同时以不同分辨率将其连续编码为视频。
使用COLOR_FormatSurface配置了MediaCodec(用于编码),以便我们能够使用GLES渲染到使用getInputSurface()查询的表面上。
媒体格式设置为MIME类型video/avc 对于大多数手机,此设置是完美的。
但对于一些手机,编码的视频色度值略微偏斜,并且底部有一个绿色条。
当前,编码器表面的分辨率为640x360。 EGLConfig选择支持32位RGBA格式的渲染表面。
在所有手机中,预览都是完美的。
因此,我认为应用程序方面或操作系统框架方面的编码器参数存在问题。

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

![绿色条形图像]2


1
这看起来确实像是颜色格式问题,当从Surface进行编码时不应该发生。您能否尝试其他分辨率?我很好奇这些设备上的编解码器在那个分辨率下是否存在漏洞。您知道所有受影响的设备是否都有相同的视频编码器芯片吗?(通常可以通过查看logcat来判断--通常会有一些硬件特定的信息。) - fadden
1
通常,预览分辨率和编码分辨率是不同的。640x360 是编码分辨率吗?你是否在编码 1080p?如果是这样,那么我认为你的问题是由于垂直对齐引起的。编码器可能会读取 1088 而不是 __1080__。如果是这样,摄像机输出应该进行类似的对齐。 - Ganesh
预览是720p。这不重要。因为我正在将其作为纹理(使用OpenGLES)渲染到编码器表面上。@fadden已经指出了问题。看起来是编解码器问题。我现在正在使用高度为16的下一个倍数的表面。 - Sahil Bajaj
@Ganesh:抱歉,我想我没有正确解释问题。 相机预览:720p,设备预览分辨率:设备分辨率,编码器分辨率:360p, 问题是YouTube直播API只支持这些分辨率: YouTube直播支持的分辨率我应该使用高度368代替360吗? 问题是这样会破坏纵横比,而且YouTube会在两侧添加一些留白。 - Sahil Bajaj
1
你不是唯一一个遇到联发科技问题的人(例如http://stackoverflow.com/questions/34891420/)。你是否检查了MediaCodecInfo.CodecProfileLevel以确认设备是否支持1080p?许多设备有一个“秘密”的16倍要求,但仍然可以正确处理1080。 - fadden
显示剩余3条评论
1个回答

5

我将为自己回答这个问题,以防其他人也会发现它有用。

显然,该问题仅出现在一些特定的芯片组上,例如 MediaTek 芯片组,它们不支持非16的倍数分辨率。在我的情况下,它是 640x360(其中高度是8的倍数)。为了部分解决这个问题,我在应用程序代码中添加了一个检查,如果编码器是 Omx.mtk,则重新配置编码器,使宽度/高度成为16的下一个倍数,在我的情况下为640x368(最接近要求即360p)。

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

如果您没有依赖于任何第三方API /播放器等,则可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接