登录

去注册 忘记密码?

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

HDR视频转SDR

JonaNorman   2024-01-29 22:17   收藏

HDRSample

EN

这个库用MediaCode和OpenGL实现了HDR和SDR转换,如果你觉得有所收获,给这个库点个赞吧,你的鼓励是我前进最大的动力。
HDR和SDR转换是为了解决以下问题
1. 播放流程,不是所有手机都支持HDR屏幕会导致视频变灰,需要转换成SDR视频
2. 编辑流程,HDR和SDR混合编辑时,要不HDR转SDR,要不SDR转HDR,不然会出现色差

我搜集了和HDR相关的资料,总结了HDR转SDR实践之旅,开发了这个库希望能帮到大家

image

现有功能实现如下,供大家一起学习一起上进
1. 输出模式(直接输出到Surface、经过OpenGL中转)
2. 视图模式(无缝切换SurfaceView和TextureView)
3. 多种纹理来源配置(Auto、YUV420Buffer、外部纹理OES、Y2Y)、纹理位深配置(8位、10位、16位)
4. HDR转SDR CubeLut配置,PQ转SDR12种、HLG转SDR4种
5. HDR转SDR Shader配置,该Shader支持对PQ视频和HLG视频进行色度矫正、色调参考、色调映射、色域转换、Gamma压缩
6. 色调映射已支持Android8的Tonemap、Android13的Tonemap、BT2446A、BT2446C、Hable
7. 色域转换已支持BT2020转BT709Clip、Compress、adpative_l0_cusp
8. 10个测试视频无缝切换

待开发功能

  • [ ] SDR转HDR逆色调映射
  • [ ] 对接Exoplayer
  • [ ] 识别HDR10+的动态元信息

效果预览

安装包地址

HDR转SDR

关键代码

代码已经都加上注释了,如果有疑惑,可以添加我的个人微信(请备注HDR视频开发),拉你进入HDR视频开发讨论群,

  1. Shader目录下实现了色度矫正、色调参考、色调映射、色域转换、Gamma压缩
  2. YUV420FragmentShader](sample/src/main/java/com/norman/android/hdrsample/player/shader/YUV420FragmentShader.kt)和[GLYUV420Renderer 纯Shader实现四种YUV420的Buffer转换成纹理
  3. Java代码读取CubeLut文件,从3s左右优化成70ms
  4. 直接使用3D纹理加载CubeLut数据
  5. 2D纹理、OES纹理、Y2Y纹理渲染
  6. 判断MediaCodec是否支持10位解码
  7. 不同位深的纹理创建
  8. GLVideoOutputImpl
  9. MediaCodec异步解码
  10. OpenGL运行环境封装

实践总结

:star: star历史

Star History Chart

项目地址:https://github.com/JonaNorman/HDRSample