ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GSYVideoPlayer 播放完成后如何保留最后一帧而不回封面

GSYVideoPlayer 播放完成后如何保留最后一帧而不回封面 GSYVideoPlayer 播放完成后如何保留最后一帧而不回封面【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayerGSYVideoPlayer 的播放器在视频自然播放结束后默认会回到封面态显示封面图、释放渲染层。如果业务上希望播完停在最后一帧、不闪封面仓库提供了一个 Demo 级播放器KeepLastFrameVideo和对应 Demo 页面来验证这个交互语义。专题文档是 doc/KEEP_LAST_FRAME.md入口总览见 doc/RECENT_FEATURES.md。先明确边界避免误解这个能力的适用范围这是Demo 级能力适合先验证业务交互文档明确说明不建议直接理解为全局播放器的默认行为它不会改变基础播放器的默认完成态也不会全局影响其他播放器页面。只覆盖自然播放完成这一种场景。播放失败、主动释放、退出页面等非自然完成场景仍走原有释放流程。能否真的保留画面取决于当前 render view 是否仍存在以及业务是否主动释放了 Surface。如果业务完成后必须展示封面、广告或推荐位应保持默认完成态不要开这个 flag。构建并安装 Demo APK从项目根目录执行构建 app 模块的 debug APK 并安装到已连接的设备./gradlew :app:assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk adb shell am start -n com.example.gsyvideoplayer/.MainActivity这条回归命令来自 doc/KEEP_LAST_FRAME.md 的回归建议章节。adb install -r是覆盖安装会替换设备上已有的同名 debug 包。相关代码位置KeepLastFrameDemoActivity.javaDemo 页面负责设置 flag、状态展示和重播KeepLastFrameVideo.javaDemo 级播放器覆写完成态切换逻辑activity_keep_last_frame_demo.xml页面布局含保留最后一帧开关和重新播放按钮设置保留最后一帧的 flag核心 API 只有一个开关// 开启自然播放完成后保留当前渲染画面 keepLastFrameVideo.setKeepLastFrameWhenComplete(true); // 关闭恢复默认完成态回到封面 keepLastFrameVideo.setKeepLastFrameWhenComplete(false);在 Demo 页面里flag 的用法可以这样对照阅读 KeepLastFrameDemoActivity.javaonCreate中对播放器调用binding.detailPlayer.setKeepLastFrameWhenComplete(keepLastFrameWhenComplete)字段初始值为true页面上的保留最后一帧按钮每次点击都会翻转 flag 并立即再次调用setKeepLastFrameWhenComplete所以可以在同一个页面内对比两种行为重新播放按钮调用startPlayLogic()重新开始播放播放结束点重播同样有效Demo 视频源是DemoVideoUrls.MP4_BBB通过GSYVideoOptionBuilder配置并设置了封面图setThumbImageView这样回封面和保留最后一帧两种结果在视觉上有明显区别。flag 在全屏和非全屏切换时会自动同步KeepLastFrameVideo#cloneParams会把mKeepLastFrameWhenComplete从源播放器复制到目标播放器因此横竖屏切换后行为一致。真机验证启动 App 后进入主页面入口完成保留最后一帧按下面清单逐项检查来自 doc/KEEP_LAST_FRAME.md开启保留最后一帧播放到自然结束确认停留在最后一帧且不显示封面。关闭保留最后一帧重新播放到结束确认回到默认封面态。播放结束后点击重播确认能重新开始。播放中进入全屏、退出全屏再等播放结束确认 flag 仍生效。退出页面后扫 logcat确认没有FATAL EXCEPTION、IllegalStateException或 Surface 相关 crash。Demo 页面下方有一行状态文本会在onAutoComplete回调中区分三种结果可以直接用来判断验证是否通过以下文案来自 Demo 源码播放完成保留最后一帧——flag 开启且本次确实保留了 render view播放完成已开启保留但当前渲染层没有可保留画面——flag 开启但完成时 render view 已无可保留的视图例如 Surface 已被业务释放这正是文档所说是否能保留画面取决于当前 render view 是否仍存在的体现播放完成默认封面态——flag 关闭。Demo 内部通过isLastAutoCompleteRetainedSurface()判断本次自然完成时是否确实保留了 render view业务代码在onAutoComplete回调里也可以用它做同样的判断。实现机制说明理解保留最后一帧是怎么做到的看 KeepLastFrameVideo.java 中对onAutoCompletion()的覆写即可。flag 开启时它不调用基础类默认的完成释放逻辑而是设置状态为CURRENT_STATE_AUTO_COMPLETE保留当前 render view记录mTextureViewContainer是否仍有子视图写入mLastAutoCompleteRetainedSurface隐藏封面层显示完成态控制 UI释放音频焦点、网络监听和屏幕常亮 flag触发onAutoComplete回调。同时onCompletion()、重新播放startButtonLogic和页面销毁仍走原释放逻辑避免资源长期残留——也就是说保留最后一帧只作用于自然完成这一次 UI 状态切换不是把播放器整体挂起。限制与下沉到基础库的注意事项文档在注意事项中给出了明确的限制条件是否能保留画面取决于当前 render view 是否仍存在以及业务是否主动释放 Surface。完成态出现已开启保留但当前渲染层没有可保留画面时说明渲染层在这之前已经被释放了。如果要把这个能力下沉到基础库需要同时设计 Surface 生命周期、封面层、重播、全屏复制、小窗等场景在此之前它只适合作为业务侧验证交互语义的参考实现。另外doc/RECENT_FEATURES.md 的整体回归建议是在修改这些近期能力后至少执行./gradlew :gsyVideoPlayer-java:testDebugUnitTest :app:assembleDebug并在真机上覆盖打开/关闭 flag确认完成后分别停留最后一帧和回到封面。修改后如果只关心这一项能力本文给出的三步构建安装加真机检查清单已经足够。验证通过的标志就是上面清单里的现象flag 开时播完停在最后一帧、不显示封面flag 关时回到封面态重播可用全屏切换后 flag 依然生效且 logcat 无异常堆栈。【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表