视频转码后有色差要如何处理呢?丨有问有答
平均阅读时长为 2分钟
今天我们要讨论的是关键帧的音视频开发圈的一位朋友在社群里提的问题,如下:
遇到了视频转码后有色差,这种一般如何处理呢?
以下是回答,欢迎大家留言讨论补充:
1、色差是如何产生的?1)有损压缩产生的质量损失。
解决方法为尽可能的提高码率。 可以使用 FFmpeg 指令查看原码率与输出码率对比,如果使用硬件编码码率要高于原码率一些,因为原文件可能使用了更高级的编码方式(软件编码)或编码参数(HEVC)。 2)颜色空间转换产生的损失。
解决方法为尽量避免颜色空间的转换,如果必须转换需要找到正确的颜色转换矩阵。 可以使用 FFmpeg 指令对比色差文件与原文件 color_range
、color_space
。
$ ffprobe -show_streams -i test.mp42、如何做颜色空间转换?颜色空间转换每个模块都会有所涉及,播放器、转码、获取缩略图等,但按照底层模块划分如下:1)解码模块:需要获取出正确的ColorSpace
、ColorRange
,然后传递给后面的模块。
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)编码模块:根据外层输入的ColorSpace
、ColorRange
,设置给编码器即可。
iOS VideoToolBox 编码设置与解码相对应 kVTCompressionPropertyKey_YCbCrMatrix
。Android 编码设置与解码相对应 KEY_COLOR_STANDARD
、KEY_COLOR_RANGE
。FFmpeg X264 编码设置 x264_param_t 内 vui.b_fullrange
、vui.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 编码必须设置ColorSpace
、ColorRange
。如果不设置底层不清楚输入进来的数据颜色格式,只能根据默认值随意发挥了。3)ColorSpace
、ColorRange
默认值。
本地文件 ColorSpace
为空,则直接默认为601
即可。本地文件 ColorRange
为空,则直接默认为非FullRange
。
如果你也对音视频技术感兴趣,比如,符合下面的情况:
在校大学生 → 学习音视频开发 iOS/Android 客户端开发 → 转入音视频领域 直播/短视频业务开发 → 深入音视频底层 SDK 开发 音视频 SDK 开发 → 提升技能,解决优化瓶颈
可以长按识别或扫描下面二维码,了解一下这个社群,根据自己的情况按需加入:
参考资料
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
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。