前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频转码后有色差要如何处理呢?丨有问有答

视频转码后有色差要如何处理呢?丨有问有答

作者头像
关键帧
发布2022-11-29 18:07:51
1.6K0
发布2022-11-29 18:07:51
举报
文章被收录于专栏:关键帧Keyframe

今天我们要讨论的是关键帧的音视频开发圈的一位朋友在社群里提的问题,如下:

遇到了视频转码后有色差,这种一般如何处理呢?

以下是回答,欢迎大家留言讨论补充:

1、色差是如何产生的?

1)有损压缩产生的质量损失。

  • 解决方法为尽可能的提高码率。
  • 可以使用 FFmpeg 指令查看原码率与输出码率对比,如果使用硬件编码码率要高于原码率一些,因为原文件可能使用了更高级的编码方式(软件编码)或编码参数(HEVC)。

2)颜色空间转换产生的损失。

  • 解决方法为尽量避免颜色空间的转换,如果必须转换需要找到正确的颜色转换矩阵。
  • 可以使用 FFmpeg 指令对比色差文件与原文件 color_rangecolor_space
代码语言:javascript
复制
$ ffprobe -show_streams -i test.mp4

2、如何做颜色空间转换?

颜色空间转换每个模块都会有所涉及,播放器、转码、获取缩略图等,但按照底层模块划分如下:

1)解码模块:需要获取出正确的 ColorSpaceColorRange,然后传递给后面的模块。

  • iOS 模块直接存在于 CVPixelBuffer,ColorSpace 为 CVImageBufferYCbCrMatrix,ColorRange 在 iOS15 后包含了 FullRange 参数,之前需要根据 CVPixelBufferGetPixelFormatType(buffer) == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 判断。
  • Android 模块需要根据解码后 MediaFormat 获取,ColorSpace 为 KEY_COLOR_STANDARD,ColorRange 为 KEY_COLOR_RANGE
  • FFmpeg 模块需要根据解码后数据 AVFrame 获取,ColorSpace 为 colorspace,ColorRange 为 color_range

2)编码模块:根据外层输入的 ColorSpaceColorRange,设置给编码器即可。

  • iOS VideoToolBox 编码设置与解码相对应 kVTCompressionPropertyKey_YCbCrMatrix
  • Android 编码设置与解码相对应 KEY_COLOR_STANDARDKEY_COLOR_RANGE
  • FFmpeg X264 编码设置 x264_param_t 内 vui.b_fullrangevui.i_colmatrix

3)YUV 数据转换 RGBA 纹理模块。

  • 数据转纹理主要涉及 GL 矩阵操作,根据解码后的 ColorSpace 与 ColorRange 生成合适的矩阵。
  • GPUImage 矩阵生成,参考:GPUImage[1]
  • libyuv 矩阵生成(搜索 『bt.』),参考:libyuv[2]

4)RGBA 纹理转换 YUV 数据模块。

  • 纹理转数据与数据转纹理相反的流程,但具体转换为哪种 ColorSpace 与 ColorRange 都可以的。
  • 参考 RGBA 转 YUV 即可:RGB2YUV[3]

5)RGB 数据与 YUV 数据转换模块。

  • 通常数据间转换使用 libyuv,例如 I420 转换 RGBA,方法为 I420ToARGBMatrix,参数支持设置矩阵 YuvConstants

3、其他建议

1)尽量减少自定义处理颜色空间转换。

Android 平台尽量使用 Surface 解码与编码,好处就是不需要手动处理。

2)ByteBuffer 编码必须设置 ColorSpaceColorRange

如果不设置底层不清楚输入进来的数据颜色格式,只能根据默认值随意发挥了。

3)ColorSpaceColorRange 默认值。

  • 本地文件 ColorSpace 为空,则直接默认为 601 即可。
  • 本地文件 ColorRange 为空,则直接默认为非 FullRange

参考资料

[1]

CPUImage: https://github.com/BradLarson/GPUImage/blob/master/framework/Source/GPUImageColorConversion.m

[2]

libyuv: https://github.com/lemenkov/libyuv/blob/master/source/row_common.cc

[3]

RGB2YUV: https://en.wikipedia.org/wiki/YUV#Y%E2%80%B2UV444_to_RGB888_conversion

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 关键帧Keyframe 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档