资讯详情

资讯详情

GSYVideoPlayer 如何用 Exo/Media3 的 HLS master 与 DASH MPD 实现自适应清晰度并固定清晰度轨道

GSYVideoPlayer 如何用 Exo/Media3 的 HLS master 与 DASH MPD 实现自适应清晰度并固定清晰度轨道【免费下载链接】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当服务端已经能提供标准的多码率流一个 HLS master playlist或一个 DASH MPD时清晰度切换不需要为每档清晰度维护一条独立 URL。GSYVideoPlayer 的 Exo/Media3 内核支持把这类流交给 Media3 的 TrackSelector同一 track group 里的多码率 video track 会被用于 adaptive playback默认按带宽、buffer 和设备能力自动选档你也可以用 override 把播放固定在某一档再随时切回自动。demo 工程里的EXO自适应清晰度入口ExoAdaptiveTrackActivity完整演示了这条路径。注意与另一条方案区分无缝切换SmartPickVideo是多个独立 URL 的切换不是HLS/DASH 标准 ABR它靠临时 manager 预加载新 URL 后同步位置切换。如果服务端能给 HLS master 或 DASH MPD优先使用本文的 Exo 自适应方案依据见 RECENT_FEATURES.md 的“多 URL 清晰度切换”一节。准备构建并安装 demodemo 的轨道 API 实现在 app 模块内GSYExoVideoManager 转调 GSYExo2MediaPlayer所以先用仓库自带的脚本构建并安装。以下命令会执行单元测试并生成 debug APK然后把 APK 安装到已连接的真机/模拟器上adb install -r覆盖安装不删除数据./gradlew :gsyVideoPlayer-java:testDebugUnitTest :app:assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk这是 RECENT_FEATURES.md “回归建议”一节给出的回归命令构建产物路径为app/build/outputs/apk/debug/app-debug.apk。启动 demo 后在主列表打开EXO自适应清晰度入口进入播放页。内置测试源HLS master 与 DASH MPDdemo 内置两个测试源定义在 DemoVideoUrls.java整理见 VIDEO_URLS.md页面上有HLS和DASH两个按钮可直接切换源源URL说明HLS masterhttps://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8DemoVideoUrls.HLS_MUXDASH MPDhttps://dash.akamaized.net/envivio/EnvivioDash3/manifest.mpdDemoVideoUrls.DASH_ENVIVIO自适应播放的搭建路径ExoAdaptiveTrackActivity的setupPlayer展示了最小搭建顺序。核心是只用一个 master/MPD URL 走setUp再用setOverrideExtension标明流类型然后起播ListGSYVideoModel urls new ArrayList(); // HLS master 或 DASH MPD二选一 urls.add(new GSYVideoModel(useDashSource ? DASH_MPD_URL : HLS_MASTER_URL, 自适应码率)); binding.detailPlayer.setUp(urls, 0); binding.detailPlayer.setOverrideExtension(useDashSource ? mpd : m3u8); binding.detailPlayer.setExoCache(false); // ...封面、标题等 UI 配置后... binding.detailPlayer.startPlayLogic();demo 中有两处值得注意的设置setExoCache(false)这两个测试源不走 Exo cache你自己的源是否开 cache 取决于业务需求。demo 进入页面时把渲染切成GSYVideoType.SURFACEonDestroy时恢复进入前的 render type如果你的业务页面渲染类型不同不要照抄这两行。起播后 TrackSelector 默认按“自动”工作由它根据带宽、buffer、设备能力在同一个 track group 的多码率 video track 之间选择不需要业务侧做任何选择。读取轨道并固定清晰度轨道信息和 override 都通过GSYExoVideoManager暴露API 见 USE.md “Exo 自适应清晰度相关 API”一节// 1. 读取当前轨道列表 ListGSYExo2MediaPlayer.VideoTrackInfo tracks GSYExoVideoManager.instance().getVideoTrackInfoList(); // 2. 固定到某一条 video track参数取自 VideoTrackInfo boolean success GSYExoVideoManager.instance() .setVideoTrackOverride(track.groupIndex, track.trackIndex); // 3. 清除 override恢复自适应 GSYExoVideoManager.instance().clearVideoTrackOverride();VideoTrackInfo的可用字段见 GSYExo2MediaPlayer.javagroupIndex/trackIndexoverride 时使用的坐标必须原样取自已读取到的 track 对象width/height/bitrate/codecs展示用信息selected当前是否被选中supported设备是否支持解码该轨道adaptiveSupported该 track group 是否支持自适应getLabel()形如720P 1500kbps的展示文本选中项末尾追加*标记例如540P 1200kbps *。两点使用前提播放未解析完成时列表为空。getVideoTrackInfoList()依赖当前Tracksmanifest 没解析完就返回空列表。demo 的做法是每 1 秒用 Handler 轮询一次轨道信息空列表时展示“视频轨道等待播放器解析中”并监听onPrepared立即刷新。固定清晰度前应先确认列表非空。setVideoTrackOverride会校验合法性。返回false的情况包括player 尚未创建、groupIndex越界、该 group 不是 video 类型、trackIndex越界或该轨道isTrackSupported为false设备不支持解码。demo 里只有supported为true的轨道会进入清晰度选择弹窗切换失败时提示“清晰度切换失败”。clearVideoTrackOverride()除了清掉 override还会把forceLowestBitrate/forceHighestSupportedBitrate复位为false并确认 video track 类型处于启用状态即完整回到 TrackSelector 自适应实现见 GSYExo2MediaPlayer.java。demo 的交互流程可直接参考 ExoAdaptiveTrackActivity.java点击清晰度按钮弹出列表第一项是“自动TrackSelector 自适应”其余项是各getLabel()选“自动”调clearVideoTrackOverride()选具体档位调setVideoTrackOverride(track.groupIndex, track.trackIndex)之后延迟 500ms 再刷新一次轨道信息确认选中项变化。验证结果按 RECENT_FEATURES.md 的回归清单EXO自适应清晰度的通过标准是HLS 和 DASH 都能播放、轨道列表能显示、自动/固定清晰度能切换。在 demo 页面上逐项对应轨道列表页面下方的轨道信息区会显示“当前源HLS Master / DASH MPD”、源 URL 和逐条轨道manifest 解析完成前显示“视频轨道等待播放器解析中”。选中项轨道文本中带*标记的是当前选中 track固定某档后再刷新标记应移到该档且清晰度按钮文本更新为对应档位自动模式下始终显示“清晰度自动”。切换失败setVideoTrackOverride返回false时 demo 弹 Toast“清晰度切换失败”clearVideoTrackOverride同理按返回值判断。播放失败onPlayError回调触发时demo 在轨道信息区显示“播放失败”加 URL可据此确认是源不可达还是其它错误。边界与限制固定清晰度是固定到单个 video trackTrackSelectionOverride只有清除 override 后才恢复自适应二者互斥。override 坐标只对当前Tracks有效重新setUp或换源后旧的groupIndex/trackIndex不再可信demo 在每次换源时重置 override 状态并重新读取。服务端只有多个独立 URL、没有 master playlist / MPD 时本方案不适用应改用无缝切换SmartPickVideo的多 URL 方案。本文的轨道 API 是 Exo/Media3 内核下的能力demo 中通过GSYExoVideoManager访问其它内核IJK、System没有对应的多码率自适应轨道管理。【免费下载链接】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),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →