You need to enable JavaScript to run this app.
导航
播放源过期自动刷新
最近更新时间:2025.06.27 19:23:31首次发布时间:2025.06.27 19:23:31
我的收藏
有用
有用
无用
无用

本文介绍如何实现播放源过期自动刷新功能。当视频的 CDN 播放地址(URL)因安全策略(如签名验证)而具有时效性时,此功能可以在 URL 过期后自动获取新的有效地址,从而保证视频的持续流畅播放,避免因地址失效导致的播放中断。

说明

如需实现此功能,请集成 Android 播放器 SDK 1.42.2.8 或以上版本。

前提条件

在为客户端实现播放源过期自动刷新功能前,您需要确保完成以下操作:

  1. 确认 CDN URL 的签名算法并获取签名密钥:
    • 若您使用视频点播 CDN,请前往视频点播控制台获取签名密钥并参考 URL 鉴权概述签名 Demo 了解签名算法。
      Image
    • 若您使用第三方云厂商的 CDN,请联系您的服务提供商获取对应域名的 CDN 签名密钥和签名算法。
  2. 在应用服务端部署刷新 URL 的接口。该接口接收一个已过期的 URL 作为请求参数,并返回一个新的有效 URL 及新 URL 的过期时间戳。服务端接口示例:
    • 请求方法:GET /api/refreshUrl
    • 请求参数:expiredUrl(已过期的 URL)
    • 返回结果:
    {
        "url": "https://www.example.com/1.mp4", // 刷新后的地址
        "expireInMS": 1705392219000 // 新地址的过期时间戳(毫秒)
    }
    

整体流程

Image

实现步骤

  1. 初始化播放器 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 一致。
        }
    }
    
  2. 在调用 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);