Skip to content

Example of converting HDR video to SDR in Android.在Android如何实现HDR视频转SDR的实践

License

Notifications You must be signed in to change notification settings

JonaNorman/HDRSample

Repository files navigation

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视频开发讨论群,如果二维码显示过期了,可以搜索微信号JonaNorman加我个人微信拉你进群(请备注HDR视频开发)

  1. Shader目录下实现了色度矫正、色调参考、色调映射、色域转换、Gamma压缩
  2. YUV420FragmentShaderGLYUV420Renderer 纯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 History Chart

特别感谢

Stargazers Forkers
Stargazers repo roster for @JonaNorman/HDRSample Forkers repo roster for @JonaNorman/HDRSample

About

Example of converting HDR video to SDR in Android.在Android如何实现HDR视频转SDR的实践

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published