[Android] 支持 HDR 和杜比视界
由于 Flutter Texture 本身的限制,我们没有办法实现 HDR 和杜比视界支持
现在 Flutter 提供了高效的基于Android 视图合成器的嵌入 Android 原生视图到应用的方法
https://docs.flutter.dev/platform-integration/android/platform-views
我们现在准备迁移 media_kit 中的 Flutter Texture 实现到上文提到的 Hybrid Composition
目前工作分支为
https://github.com/Predidit/media-kit/pull/3
这一事务的总体优先级不高,因为我们并没有支持 HDR 的视频源。但是这项非常有挑战性,所以我们会继续下去。
如果对这一特性感兴趣,可以在这里回复。
非常期待这个特性!
非常不幸这个想法需要长期搁置,虽然相关 PR 已经实现了可以运行的原型。
以下是主要的问题
-
真正的 PlatformView 并不高效,相关性能开销完全无法和基于 Texture 的方案相提并论。Flutter 现在推荐的 PlatformView 方案本质是封装好的 Texture 而不是真正的原生视图。真正的 PlatformView 方案仍然存在,但因为各种难以解决的问题不再被 Flutter 官方推荐。我们需要的功能只有真正的原生视图才能实现,我们被迫使用不推荐的 API ,这意味着很多问题来自框架本身,根本无法解决。
-
由于 PlatformView 的实现原理,在 UI 复杂的情况下可能出现未预期的行为,例如在 Kazumi 中有时会出现控制面板的裁剪问题。此问题需要在 Flutter 框架层面解决。
-
由于 PlatformView 的实现原理,同时创建多个播放器会导致严重的卡顿或直接 ANR。此问题需要在 Flutter 框架层面解决。
如果你在开发自己的 Flutter 播放器,可以考虑使用现有的代码,它们可以工作,但是需要注意不要在播放器上叠加太多层覆盖层,并且不要尝试实现多路播放功能。
您好,
非常感谢您这么快就给了如此详尽的回复,信息量巨大,也很有启发。
我会去尝试使用一下您的原型。
再次感谢您开创性的工作和坦诚的分享。
@Shinokawa 我这边基于 media-kit 官方分支实现了一个版本,有需要的可以尝试: https://github.com/chenx-dust/media-kit
相当干净的实现,唯一的问题是使用 mediacodec-embed 作为默认 vo 。这会破坏 mpv 的大部分后处理滤镜。
这应该是为了解决默认的 vo 也就是 gpu 对 hdr 的支持不佳的问题。正确的做法应该是迁移到新的 vo 也就是 gpu-next 。这将兼顾后处理滤镜和 hdr 支持。
但是 gpu-next 对 mpv 版本有要求,当前使用的 0.35 版本的 mpv 并不支持。你可以尝试按照我之前的实现将 mpv 静态库的下载链接指向我发布的 1.0.2 版本进行测试。
在解决这个问题后,你有兴趣向 media-kit 官方仓库提交 PR 吗。
相当干净的实现,唯一的问题是使用 mediacodec-embed 作为默认 vo 。这会破坏 mpv 的大部分后处理滤镜。
这应该是为了解决默认的 vo 也就是 gpu 对 hdr 的支持不佳的问题。正确的做法应该是迁移到新的 vo 也就是 gpu-next 。这将兼顾后处理滤镜和 hdr 支持。
但是 gpu-next 对 mpv 版本有要求,当前使用的 0.35 版本的 mpv 并不支持。你可以尝试按照我之前的实现将 mpv 静态库的下载链接指向我发布的 1.0.2 版本进行测试。
感谢大佬的提醒!我尝试进行调整。
在解决这个问题后,你有兴趣向 media-kit 官方仓库提交 PR 吗。
个人希望在成功实现 iOS 平台的 PlatformView 后再向上游提交 PR ,以后有更多问题还得请教您!
我这边尝试更换您的 1.0.2 版本的 mpv 视频库、切换为 gpu-next 之后,依然没能成功实现 HDR 效果。请问是需要额外的配置项目吗?
mediacodec-embed 作为 vo 时的 hdr 是正常的吗
mediacodec-embed 作为 vo 时的 hdr 是正常的吗
是正常的呢
真奇怪,稍后我来测试一下 :D
我发现 HDR 呈现似乎还和硬件解码方式、视频源有关,我的了解有限,还得多调试一下
在条件允许的情况下,启用 HCPP 带来的 PlatformView 性能性能提升非常可观,同时也很大地缓解了一些渲染问题 参考: https://zhuanlan.zhihu.com/p/24176997869
https://github.com/mpv-player/mpv/pull/16818 这个pr实现了一个基于libplacebo的libmpv backend
是的,新的支持 gpu-next 的 libmpv 后端很有潜力,但是我们要实现 HDR 支持的最大困境不在这里。
skia 不支持 HDR ,所以只要我们使用 flutter texture 组件就不可能实现 HDR,基于 PlatformView 的真正的原生视图合成是解决这一问题的唯一方法,而 PlatformView 方案不需要使用 libmpv API 。
@chenx-dust 的方案几乎是最优解,我之前忙于 linux 视频渲染器的问题以及其他的一些琐事,一直还没来得及尝试解决这个方案中最后的一些问题。