本文介绍如何实现播放源过期自动刷新功能。当视频的 CDN 播放地址(URL)因安全策略(如签名验证)而具有时效性时,此功能可以在 URL 过期后自动获取新的有效地址,从而保证视频的持续流畅播放,避免因地址失效导致的播放中断。
说明
如需实现此功能,请集成 Android 播放器 SDK 1.42.2.8 或以上版本。
在为客户端实现播放源过期自动刷新功能前,您需要确保完成以下操作:
GET /api/refreshUrl
expiredUrl
(已过期的 URL){ "url": "https://www.example.com/1.mp4", // 刷新后的地址 "expireInMS": 1705392219000 // 新地址的过期时间戳(毫秒) }
初始化播放器 SDK 后,设置 URL 刷新器工厂并实现 URL 刷新逻辑:
// 1. 初始化播放器 SDK Env.init(/* 省略 **/); // 2. 设置调用 TTVideoEngineSourceRefreshStrategy.setUrlFetcherFactory 设置 TTVideoEngineUrlFetcher 工厂。 TTVideoEngineSourceRefreshStrategy.setUrlFetcherFactory(new TTVideoEngineUrlFetcher.Factory() { @Override public TTVideoEngineUrlFetcher create(TTVideoEngine engine) { return new AppUrlFetcher(); } }); // 3. 实现 TTVideoEngineUrlFetcher,在 fetch 方法中请求您的应用服务端提供的刷新 URL 接口。 // - 成功时:调用 callback.onSuccess,并传入刷新后的新 URL 和过期时间。 // - 失败时:调用 callback.onError,并传入错误码和错误信息。 public class AppUrlFetcher implements TTVideoEngineUrlFetcher { // 示例 App 的网络引擎,请替换为 OKHttp/Retrofit 等 private AppNetClient mClient; @Override public void fetch(UrlRequest urlRequest, Callback<UrlResult> callback) { mClient = new AppNetClient(); mClient.getRefreshedCdnUrl(urlRequest.url, new Callback() { @Override public void onSuccess(String newUrl, long expireTimeInMS) { callback.onSuccess(new UrlResult(newUrl, expireTimeInMS)); } @Override public void onError(String errorCode, String errorMsg) { callback.onError(errorCode, errorMsg); } }); } @Override public void cancel() { if (mClient != null) { mClient.release(); } } }; /** * 4. (可选)为 HLS 源自定义 CacheKey,非 HLS 源不用调用 CacheSettings.getInstance().setGenerateFileKeyCallback 方法。 * * 针对 HLS,TS 地址的 cacheKey 默认生成规则是 md5(pathOf(tsUrl)); * 对于 TS 地址签算在 path 中的情况,为保证 cacheKey 的唯一性,需要业务通过下面接口自定义 ts cacheKey 的生成规则。 */ CacheSettings.getInstance().setGenerateFileKeyCallback(new CacheSettings.IGenerateFileKeyCallback() { /** * @param url: TS 地址 * @param fileKey: hls 的 key * @param extraInfo: 目前为空,为后面做兼容考虑 * @return 自定义的 ts cacheKey */ @Override public String generateFileKey(String url, String fileKey, Map<String, String> extraInfo) { // 根据 url 规则,生成 cacheKey,保证同一个 ts 文件两次签算后的 cdn url 生成的 cacheKey 一致。 } }
在调用 play
方法之前 ,通过 setIntOption
方法开启播放源过期自动刷新功能。
videoEngine.setIntOption(TTVideoEngine.PLAYER_OPTION_INT_ENABLE_SOURCE_REFRESH_STRATEGY, 1); // 需要在 setStrategySource 前设置 videoEngine.setIntOption(TTVideoEngine.PLAYER_OPTION_INT_ENABLE_SOURCE_REFRESH_STRATEGY, 1); // 对于 HLS 视频源,建议同时开启 PLAYER_OPTION_ENABLE_SEG_ERROR 选项 videoEngine.setIntOption(TTVideoEngine.PLAYER_OPTION_ENABLE_SEG_ERROR, 1); videoEngine.setStrategySource(xxx);