添加播放器播放信息叠加面板#3120
Open
wjb6666 wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
改动概述
这个 PR 为播放器增加了一个类似 PotPlayer 的“播放信息”叠加面板。播放视频时可以按
Tab键显示或隐藏当前媒体的详细信息,便于排查播放质量、解码器、码率、分辨率等问题。面板当前会展示以下信息:
如果某个平台或播放后端暂时无法提供某一项数据,面板会显示为“未知”,不会影响正常播放。
具体实现
1. 新增通用播放信息数据结构和 UI
在
app/shared/video-player/src/commonMain/kotlin/ui/PlayerStatsOverlay.kt中新增了:PlayerStatsSnapshot:用于承载一次采样得到的播放信息快照。rememberPlayerStatsState(player):使用expect/actual机制,由各平台分别实现具体的数据读取逻辑。PlayerStatsOverlay(stats):通用 Compose UI,用半透明黑色浮层展示播放信息。这样 UI 展示逻辑放在 commonMain,平台差异只集中在数据采集层。
2. Desktop 端读取 VLC 播放信息
在
app/shared/video-player/src/desktopMain/kotlin/ui/PlayerStatsOverlay.desktop.kt中实现 Desktop 端数据采集。Desktop 播放后端实际使用 VLC,因此这里会尝试把
MediampPlayer.impl转成EmbeddedMediaPlayer,然后通过 VLCJ 获取:media().info().videoTracks():读取视频轨道信息,例如宽高、帧率、视频编码、视频码率。media().info().audioTracks():读取音频轨道信息,例如音频编码、音频码率、采样率、声道数。media().info().statistics():读取实时统计,例如输入码率、解复用码率、解码帧数、丢帧和音频缓冲丢失数量。status().rate():读取播放速率。如果当前播放器实现不是 VLC,或者 VLC 数据读取失败,会回退到基础信息,只显示播放状态、标题、进度、时长和播放速度。
3. Android 端读取 ExoPlayer 播放信息
在
app/shared/video-player/src/androidMain/kotlin/ui/PlayerStatsOverlay.android.kt中实现 Android 端数据采集。Android 端会尝试把
MediampPlayer.impl转成ExoPlayer,然后读取:videoFormat:视频编码、视频码率、帧率、宽高。audioFormat:音频编码、音频码率、采样率、声道数。videoSize:作为分辨率 fallback。videoDecoderCounters和audioDecoderCounters:读取已渲染 buffer 数和丢弃 buffer 数。playbackParameters.speed:读取播放速度。如果当前播放器实现不是 ExoPlayer,同样回退到基础信息。
4. iOS 端提供安全 fallback
在
app/shared/video-player/src/iosMain/kotlin/ui/PlayerStatsOverlay.ios.kt中提供 iOS 端实现。目前 iOS 端只读取通用基础信息,包括播放后端名称、播放状态、标题、进度、总时长和播放速度。视频轨道、音频轨道和实时码率等字段暂时显示为“未知”。这样可以保持 multiplatform 编译结构完整,同时不引入 iOS 平台额外风险。
5. 接入播放器界面层
在
app/shared/src/commonMain/kotlin/ui/subject/episode/EpisodeVideo.kt中新增:showPlayerStats状态,用于控制播放信息面板显示或隐藏。rememberPlayerStatsState(playerState),每秒刷新一次播放信息。PlayerStatsOverlay(playerStats)传入播放器 scaffold。onTogglePlayerStats传给手势层,用于响应Tab快捷键。这样播放页面本身只负责持有“是否显示”的状态,具体快捷键和 UI 渲染都分别交给手势层和 overlay 组件。
6. 扩展 VideoScaffold 支持播放信息叠加层
在
app/shared/video-player/src/commonMain/kotlin/ui/VideoScaffold.kt中新增参数:这个 overlay 会被放置在播放器内容区域左上角,并使用窗口 inset 避开顶部和横向安全区域。这样播放信息面板可以覆盖在视频画面上方,但不会干扰原有顶部栏、底部控制栏和侧边面板逻辑。
7. 扩展播放器快捷键处理
在以下文件中加入
Tab快捷键回调传递:app/shared/video-player/src/commonMain/kotlin/ui/gesture/GestureLock.ktapp/shared/video-player/src/commonMain/kotlin/ui/gesture/PlayerGestureHost.kt新增
onTogglePlayerStats回调,并在GestureFamily中新增keyboardTogglePlayerStats开关。默认启用后,播放器获得键盘焦点时按Tab会切换播放信息面板显示状态。用户体验
使用方式:
Tab显示播放信息面板。Tab隐藏播放信息面板。面板默认位于播放器左上角,样式为半透明黑色背景和等宽字体,便于在视频画面上阅读技术信息。
兼容性说明
验证
已在本地执行 Desktop 相关编译验证:
结果:
BUILD SUCCESSFULAndroid 编译未在本机执行,因为当前机器未配置 Android SDK,缺少
ANDROID_HOME或local.properties中的sdk.dir。