You need to enable JavaScript to run this app.
文档中心
视频点播

视频点播

复制全文
进阶功能
播放源过期自动刷新
复制全文
播放源过期自动刷新

本文介绍如何实现播放源过期自动刷新功能。当视频的 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);
    
最近更新时间:2025.06.27 19:23:31
这个页面对您有帮助吗?
有用
有用
无用
无用