视频转码后有色差要如何处理

2023-11-18

目录

视频转码后有色差要如何处理

KEY_COLOR_STANDARD 

KEY_COLOR_RANGE


视频转码后有色差要如何处理

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

1、色差是如何产生的?

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

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

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

  • 解决方法为尽量避免颜色空间的转换,如果必须转换需要找到正确的颜色转换矩阵。
  • 可以使用 FFmpeg 指令对比色差文件与原文件 color_rangecolor_space
$ 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

如果你也对音视频技术感兴趣,比如,符合下面的情况:

  • 在校大学生 → 学习音视频开发
  • iOS/Android 客户端开发 → 转入音视频领域
  • 直播/短视频业务开发 → 深入音视频底层 SDK 开发
  • 音视频 SDK 开发 → 提升技能,解决优化瓶颈

不妨看看《是的,我建了一个进阶百万年薪的社群》了解一下这个社群,根据自己的需要,按需加入。

KEY_COLOR_STANDARD 

在Android中,KEY_COLOR_STANDARD 是用于设置视频编码颜色标准的关键字。这个参数是在设置 MediaFormat 对象时使用的,该对象用于配置媒体编解码器(MediaCodec)。以下是一个例子:

MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height);
format.setInteger(MediaFormat.KEY_COLOR_STANDARD, MediaFormat.COLOR_STANDARD_BT709);
...
MediaCodec encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

KEY_COLOR_RANGE

KEY_COLOR_RANGE 是在Android中用于设置视频编码颜色范围的关键字。这个参数也是在设置 MediaFormat 对象时使用的,该对象用于配置媒体编解码器(MediaCodec)。以下是一个例子:

MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height);
format.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_FULL);
...
MediaCodec encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

在这个例子中,我们创建了一个新的 MediaFormat 对象,用于配置一个 MediaCodec 对象。我们使用 KEY_COLOR_RANGE 来设置颜色范围为 COLOR_RANGE_FULL

就像 KEY_COLOR_STANDARD 一样,不是所有的设备或编码器都支持所有的颜色范围。在设置颜色范围之前,你应该检查设备或编码器是否支持你想要设置的颜色范围。

参考2:

https://stackoverflow.com/questions/68629271/opencv-read-write-video-color-difference

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视频转码后有色差要如何处理 的相关文章

  • VS2017卡在登录界面问题

    文章目录 前言 分析 总结 参考链接 前言 之前一直在用VS2017来进行C 开发工作 今天打开软件 提示需要登录才能继续使用 但是在登录时 发现一直卡在登录界面 无法继续 如下图 分析 这里感觉是微软服务器连接不上导致的 所以在网上搜索了

随机推荐

  • 搭建MariaDB Gelera Cluster数据库集群

    基础准备 node1 node2 node3 yum源 三节点 安装并初始化数据库 三节点 配置数据库文件 三节点 node2 3 登录数据库 并赋予root用户远程权限后关闭数据库 三节点 启动数据库集群 验证集群功能 查看到wsrep
  • 适合男生的6个副业项目

    现在社会越来越激烈 大家都想在工作之余挣点外快 甚至实现财务自由 本文就为你们介绍几种适合男生从事的副业项目 1 成为自媒体达人 自媒体运营就是你在社交网络 博客 视频平台等自由发挥创作才华 发布内容 并从中赚钱的副业方式 随着智能手机和网
  • 以太坊geth客户端安装经历,也是艰难的一笔。

    现在开始通过看B站的视频学习以太坊 作为入门你看完基本理论肯定是要自己安装geth客户端的 可我缺出现了一些问题 首先我是liunx系统 通过putty软件连接的阿里云 在上面经行一些基本操作 对liunx指令一窍不通的我也是开始liunx
  • Spark项目实战-集群SSH免密码登录

    首先我们会根据之前的CentOS安装教程再搭建sparkproject2和sparkproject3两台虚拟机机器 然后在这基础上配置三台机器之间的ssh免密码登录 1 在三台机器的 etc hosts文件中 都配置对三台机器的ip hos
  • .NET 页面间传值的几种方法

    1 QueryString 这是最简单的传值方式 但缺点是传的值会显示在浏览器的地址栏中且不能传递对象 只适用于传递简单的且安全性要求不高的数值 传递 location href WebForm2 aspx name yourName 接收
  • 刷脸支付就是个破局的大杀器

    科技推动创新 改变产业链格局 从二维码支付爆发取代刷银行卡支付后 传统银行一直担忧的金融脱媒挑战实际上已是即成现实 尽管从监管层面上 一系列如 断直联 二维码互通 等监管要求 对金融机构有较大利好 但在二维码支付时代 大局已定 缺乏C端运营
  • 腾讯文件和微云服务器,网盘Web客户端对比:腾讯微云支持32GB单文件上传

    网盘Web客户端对比 腾讯微云支持32GB单文件上传 网盘最基本的客户端就是Web客户端 为了让这个最基本的客户端更好用 除了网易网盘以及新浪微盘外 其余几款网盘都有提供浏览器插件的下载 这些插件主要提供三个重要的功能 分别是大文件上传 断
  • matlab GUI窗口最大化,以及控件大小和字体自适应

    1 GUI 窗口最大化 双击除控件外的空白处 视图 属性检查器 resize on即可 设置完这个 当放大的时候 会发现我们控件的位置没有变化 此时我们需要设置一个 工具 GUI选项 调整大小的方式 成比例 2 控件大小和字体自适应 当我们
  • pytorch学习:loss为什么要加item()

    作者 陈诚 链接 https www zhihu com question 67209417 answer 344752405 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 PyTorch 0 4 0版本去
  • C#各种结束进程的方法详细介绍

    转自http www cnblogs com zjoch p 3654940 html Process类的CloseMainWindow Kill Close Process CloseMainWindow是GUI程序的最友好结束方式 从名
  • Activity的IntentFilter匹配规则

    读书笔记 我们知道 启动Activity分为两种方式 显示调用和隐式调用 显示调用需要明确的指定被启动对象的组件信息 包括包名和类名 而隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息 如果不匹配将无法启
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是
  • CheckNetisolation加速microsoft store访问(需使用代理)

    CheckNetisolation命令行工具 1 通过注册表获取 Microsoft Store 应用的 SID 通过 Win R 快捷键打开 运行 窗口 输入 Regedit 打开注册表编辑器 然后逐级定位到HKEY CURRENT US
  • 51单片机数码管循环显示0 9c语言,如何采用单片机实现数码管循环显示0-9

    描述 8个数码管滚动显示同一个数字 8个数码管显示多个不同的字符 8个数码管闪烁显示 8个数码管滚动显示数字串 include CONFIG 0x3B31 unsigned char tab 0x3f 0x06 0x5b 0x4f 0x66
  • Linux线程控制

    本篇我将学习如何使用多线程 要使用多线程 因为Linux没有给一般用户直接提供操作线程的接口 我们使用的接口 都是系统工程师封装打包成原生线程库中的 那么就需要用到原生线程库 因此 需要引入 lpthread 即连接原生线程库 原生线程库
  • [1181]linux两台服务器之间传输文件和文件夹

    文章目录 scp 1 从服务器复制文件到本地 2 复制文件到本地并重命名 3 从服务器复制文件夹到本地 4 从本地复制文件到服务器 不包括文件夹本身 5 从本地复制文件夹到服务器 包括文件夹本身 rcp 命令使用 wget rsync 在日
  • Vue3父子组件通信,父子传参

    Vue3父子组件通信 父子传参 前言 Vue2的小伙伴应该该经历过转战Vue3过程的中的抓狂 好多地方使用都不太一样 这期就给大家讲一下近期我也在用vue3开发中遇到到的问题父子组件通信 父传子 在父组件中引入son vue子组件 为子组件
  • sql 2008 R2 修改数据库表编辑行200小技巧

    在使用sql server 2008 R2时 有时候要打开一个表 看里面的数据 发现只能编辑前面200行 如下图 如果我的数据库表的数据 超过200 怎么办呢 其实只要修改下配置 就可以了 如下图 点击选项 进入选项界面 如下图 在sql
  • nginx配置主域名跳转www域名并支持ssl

    server listen 80 listen 443 ssl server name xxxx com return 301 https www xxx com request uri server listen 80 server na
  • 视频转码后有色差要如何处理

    目录 视频转码后有色差要如何处理 KEY COLOR STANDARD KEY COLOR RANGE 视频转码后有色差要如何处理 以下是回答 欢迎大家留言讨论补充 1 色差是如何产生的 1 有损压缩产生的质量损失 解决方法为尽可能的提高码