Skip to content

KSYListSource

xinbaicheng edited this page Apr 14, 2017 · 5 revisions

分片视频(List Urls)播放

可将一组分片url传递给播放器,播放器会将其看做是一个视频文件进行播放,分片播放切换过程对用户无感知,该特性多适用于内容提供方将一个视频文件切割成若干个分片的情况(非m3u8协议)

该功能仅适用于点播

1. 版本要求

SDK版本:v1.9.0及以上

2. 特性及要求说明

  • 可支持的分片封装格式包括flv、ts、mp4等
  • 要求所有的分片封装格式,视频编码格式、分辨率,音频编码格式、采样率等参数必须一致,不同的话可能会造成后面的分片无法正常播放
  • 播放器会将输入的列表视为一个视频,获取视频相关信息的接口如 getCurrentPositiongetDuration 以及对视频操作如 seekTo 均会基于整个视频来计算
  • 准备完成的回调onPrepared、播放完成的回调onCompletion在一次播放行为中只会发送一次,而不会每个分片都发送一次

3. 新增接口

/**
 * 由金山云引入,支持List视频播放,要求List中的视频格式与分辨率必须一致,音频格式必须一致
 * @param sourceList 视频播放地址列表
 * @param headers http请求的自定义header
 * @throws IllegalArgumentException 输入视频列表为空
 */
public void setDataSource(List<String> sourceList, Map<String, String> headers)

4. 调用示例

KSYTextureView mKsyTextureView;
int mTimeoutForOneSeg = 1; // 每个分片的prepare超时阈值,此处以 1s 为例
// 组装播放地址
ArrayList<String> sourceList = new ArrayList<>();

sourceList.add(0, "http://test123.com/0.mp4");
sourceList.add(1, "http://test123.com/1.mp4");
sourceList.add(2, "http://test123.com/2.mp4");
...

// 是否设置Header根据自身需求决定
Map<String, String> headers = new HashMap<>();

headers.put("Referer", "http://test123.com");
// 设置prepare超时阈值,分片较多时需设置较大的prepare超时阈值
int prepareTimeout = sourceList.size() * mTimeoutForOneSegmKsyTextureView.setTimeout(prepareTimeout, 30);

try {
    mKsyTextureView.setDataSource(sourceList, headers);
    mKsyTextureView.prepareAsync();
} catch (IOException ex) {
} catch (IllegalArgumentException ex) {
}

5. 注意事项

由于需要依次解析所有分片的格式信息,建议播放list形式的url时,使用setTimeout方法将prepare超时时间设置长一些。 例如,假设有N个分片,每个分片的prepare的超时阈值为t,则setTimeout设置的prepare超时阈值为 N*t
超时设置含义及接口可参见Wiki

6. 相关错误码

变量名 数值 含义
MEDAI_ERROR_INVALID_URL -10019 1.无效的URL 2.获取每个分片流信息时超过设置的prepare超时阈值
Clone this wiki locally