Kazumi icon indicating copy to clipboard operation
Kazumi copied to clipboard

[Android] 支持 HDR 和杜比视界

Open Predidit opened this issue 7 months ago • 14 comments

由于 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 的视频源。但是这项非常有挑战性,所以我们会继续下去。

如果对这一特性感兴趣,可以在这里回复。

Predidit avatar May 24 '25 07:05 Predidit

非常期待这个特性!

Shinokawa avatar Aug 02 '25 15:08 Shinokawa

非常不幸这个想法需要长期搁置,虽然相关 PR 已经实现了可以运行的原型。

以下是主要的问题

  1. 真正的 PlatformView 并不高效,相关性能开销完全无法和基于 Texture 的方案相提并论。Flutter 现在推荐的 PlatformView 方案本质是封装好的 Texture 而不是真正的原生视图。真正的 PlatformView 方案仍然存在,但因为各种难以解决的问题不再被 Flutter 官方推荐。我们需要的功能只有真正的原生视图才能实现,我们被迫使用不推荐的 API ,这意味着很多问题来自框架本身,根本无法解决。

  2. 由于 PlatformView 的实现原理,在 UI 复杂的情况下可能出现未预期的行为,例如在 Kazumi 中有时会出现控制面板的裁剪问题。此问题需要在 Flutter 框架层面解决。

  3. 由于 PlatformView 的实现原理,同时创建多个播放器会导致严重的卡顿或直接 ANR。此问题需要在 Flutter 框架层面解决。

如果你在开发自己的 Flutter 播放器,可以考虑使用现有的代码,它们可以工作,但是需要注意不要在播放器上叠加太多层覆盖层,并且不要尝试实现多路播放功能。

Predidit avatar Aug 02 '25 15:08 Predidit

您好,

非常感谢您这么快就给了如此详尽的回复,信息量巨大,也很有启发。

我会去尝试使用一下您的原型。

再次感谢您开创性的工作和坦诚的分享。

Shinokawa avatar Aug 02 '25 16:08 Shinokawa

@Shinokawa 我这边基于 media-kit 官方分支实现了一个版本,有需要的可以尝试: https://github.com/chenx-dust/media-kit

chenx-dust avatar Nov 22 '25 17:11 chenx-dust

相当干净的实现,唯一的问题是使用 mediacodec-embed 作为默认 vo 。这会破坏 mpv 的大部分后处理滤镜。

这应该是为了解决默认的 vo 也就是 gpu 对 hdr 的支持不佳的问题。正确的做法应该是迁移到新的 vo 也就是 gpu-next 。这将兼顾后处理滤镜和 hdr 支持。

但是 gpu-next 对 mpv 版本有要求,当前使用的 0.35 版本的 mpv 并不支持。你可以尝试按照我之前的实现将 mpv 静态库的下载链接指向我发布的 1.0.2 版本进行测试。

在解决这个问题后,你有兴趣向 media-kit 官方仓库提交 PR 吗。

Predidit avatar Nov 22 '25 17:11 Predidit

相当干净的实现,唯一的问题是使用 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 ,以后有更多问题还得请教您!

chenx-dust avatar Nov 22 '25 18:11 chenx-dust

我这边尝试更换您的 1.0.2 版本的 mpv 视频库、切换为 gpu-next 之后,依然没能成功实现 HDR 效果。请问是需要额外的配置项目吗?

chenx-dust avatar Nov 23 '25 04:11 chenx-dust

mediacodec-embed 作为 vo 时的 hdr 是正常的吗

Predidit avatar Nov 23 '25 10:11 Predidit

mediacodec-embed 作为 vo 时的 hdr 是正常的吗

是正常的呢

chenx-dust avatar Nov 23 '25 11:11 chenx-dust

真奇怪,稍后我来测试一下 :D

Predidit avatar Nov 23 '25 11:11 Predidit

我发现 HDR 呈现似乎还和硬件解码方式、视频源有关,我的了解有限,还得多调试一下

chenx-dust avatar Nov 23 '25 19:11 chenx-dust

在条件允许的情况下,启用 HCPP 带来的 PlatformView 性能性能提升非常可观,同时也很大地缓解了一些渲染问题 参考: https://zhuanlan.zhihu.com/p/24176997869

chenx-dust avatar Nov 24 '25 14:11 chenx-dust

https://github.com/mpv-player/mpv/pull/16818 这个pr实现了一个基于libplacebo的libmpv backend

labulakalia avatar Nov 29 '25 16:11 labulakalia

是的,新的支持 gpu-next 的 libmpv 后端很有潜力,但是我们要实现 HDR 支持的最大困境不在这里。

skia 不支持 HDR ,所以只要我们使用 flutter texture 组件就不可能实现 HDR,基于 PlatformView 的真正的原生视图合成是解决这一问题的唯一方法,而 PlatformView 方案不需要使用 libmpv API 。

@chenx-dust 的方案几乎是最优解,我之前忙于 linux 视频渲染器的问题以及其他的一些琐事,一直还没来得及尝试解决这个方案中最后的一些问题。

Predidit avatar Nov 29 '25 16:11 Predidit