使用 Surface 输入时如何在 Android 上使用 MediaCodec 编码全范围视频?

问题描述 投票:0回答:2

我正在尝试使用 MediaCodec 对 bt709 全范围视频进行编码。当使用表面作为输入时,在 MediaFormat 中设置 COLOR_RANGE 属性会导致高通手机上出现奇怪的行为,编码的视频似乎被洗白(可能是使用错误的矩阵转换的 RGBA)。知道我应该做什么来确保 rgba2yuv 转换正确吗?我正在使用本机 C++ 代码并使用 JNI 调用 Java 方法。

另外,我尝试使用缓冲区作为输入,但是,由于我需要从视频编辑中获取渲染结果,glReadPixels 会导致严重的延迟。即使在我使用着色器将 RGBA 转换为 yuv 并使用 PBO 获取数据之后,使用缓冲区进行编码仍然非常慢,大约是表面输入的两倍,这对于我的场景几乎无法使用。

android c++ android-mediacodec surface
2个回答
0
投票

请勿使用

COLOR_RANGE_FULL
MediaCodec
进行视频编码,请使用
COLOR_RANGE_LIMITED

“有限”颜色范围是视频内容的默认颜色范围。 当视频编码器将 RGB 颜色值转换为 YCbCr 时,它会根据

BT.709
标准将它们转换为有限范围。用于配置编码器的颜色范围属性对转换没有影响。

但是为什么视频被冲掉了?

如果您使用相同的

MediaFormat
来配置
MediaCodec
MediaMuxer
,则输出文件将错误地在元数据中包含“完整”颜色范围。解码器/播放器将看到“完整”范围并且 误解颜色值。


0
投票

发现一个有趣的事情,使用高通 SOC,SDR BT709 有限范围转换也使用了错误的矩阵(看起来像 BT601 tv)。我测试了不同的手机,那些配备 Kirin SOC 和 MTK SOC 的手机可以生成正确的 BT709 电视视频,而所有配备 Qualcomm SOC 的设备生成的视频与原始视频存在色差。

© www.soinside.com 2019 - 2024. All rights reserved.