VideoModel 是火山引擎播放器 SDK 针对多清晰度场景推出的面向极致体验的自研协议。通过 VideoModel,您可以将包含多清晰度、多格式视频流的复杂信息整合为单个对象,并直接将这些信息传递给播放器 SDK 进行播放。使用 VideoModel 具有以下优势:
VideoModel 的构造方式取决于您的视频数据来源。主要分为以下两种路径:
Builder 的 set 方法(如 setUrl、setBitrate 等),将各路视频流的信息填充到 IVideoModel 对象中。GetPlayInfo 接口,获取包含视频元数据的 JSON 字符串。IVideoModel 对象,无需手动解析和设置字段。假设您的业务数据模型 VideoItem 如下:
// 业务视频 Model public class VideoItem { public String videoId; public long durationInS; public List<StreamItem> streamItems; // 每一个 StreamItem 代表一路特定清晰度的视频流 public static class StreamItem { public String url; public String cacheKey; public String codecType; // "h264", "h265" public String format; // "dash", "hls", "mp4" public int width; public int height; public int bitrate; public Resolution resolution; public String playAuth; // 私有 DRM 密钥 } }
您可以参考以下示例代码,将 VideoItem 对象转换为 IVideoModel:
public static IVideoModel createVideoModel(VideoItem videoItem) { List<VideoInfo> videoInfos = new ArrayList<>(); // 遍历所有清晰度流,为每一路流创建一个 VideoInfo 对象 for (VideoItem.StreamItem streamItem : videoItem.streamItems) { videoInfos.add(new BareVideoInfo .Builder() // --- 基础信息 --- .urls(Arrays.asList(streamItem.url)) // 视频流的 URL 列表。**必须设置**。 .fileHash(streamItem.cacheKey) // 视频流的唯一缓存 Key。**必须设置**。 .resolution(streamItem.resolution) // 清晰度档位枚举。**必须设置**。 .codecType(streamItem.codecType) // 编码类型 (如 "h264", "h265")。**必须设置**。 // --- ABR 与平滑切换所需信息 --- .bitrate(streamItem.bitrate) // 码率 (单位: bps)。是 ABR 和平滑切换的必要字段。 .vWidth(streamItem.width) // 视频宽度。是 ABR 的必要字段。 .vHeight(streamItem.height) // 视频高度。是 ABR 的必要字段。 .format(streamItem.format) // 格式类型 (如 "dash", "hls")。是 ABR 和平滑切换的必要字段。 .mediaType(VideoRef.TYPE_VIDEO) // 流类型。对于 DASH 播放,必须明确设置为 video 或 audio。 // --- DRM 加密所需信息 --- .spadea(streamItem.playAuth) // 私有 DRM 密钥 (playAuth),用于解密视频流。 .build()); } // 将所有 VideoInfo 聚合到一个 BareVideoModel 中 return new BareVideoModel.Builder() .vid(videoItem.videoId) // 视频的唯一 ID。**必须设置**。 .duration(videoItem.durationInS) // 视频总时长(单位:秒)。 .setVideoInfos(videoInfos) // 包含所有清晰度流的列表。**必须设置**。 .adaptive(true) // 如需支持平滑切换或 ABR,必须设置为 true。 .dynamicType(TTVideoEngine.DYNAMIC_TYPE_SEGMENT_BASE) // 当 format 为 dash 或 fmp4 时需要设置。 .build(); }
您的业务服务端获取到视频点播 GetPlayInfo 接口返回的 JSON 字符串时,可以使用以下方法将其转换为 IVideoModel 对象。
/** * 从 JSON 字符串创建 IVideoModel 实例的辅助方法。 * @param jsonModel 来自火山引擎视频点播 GetPlayInfo 接口的 JSON 字符串。 * @return 一个 IVideoModel 实例;如果解析失败则返回 null。 */ @Nullable static IVideoModel create(String jsonModel) { if (TextUtils.isEmpty(jsonModel)) return null; VideoRef ref = new VideoRef(); try { ref.extractFields(new JSONObject(jsonModel)); VideoModel model = new VideoModel(); model.setVideoRef(ref); return model; } catch (Throwable throwable) { return null; } }
传入的 JSON 字符串应该是 GetPlayInfo 接口响应体中 Result 字段对应的 JSON 对象,而非整个响应的字符串。Result 对象结构示例如下:
{ "Vid": "v029c1g10003civ2i5mqib*******", "Status": 1, "PosterUrl": "https://img.***.com/1234/8511abe****.jpeg", "Duration": 0.1, "FileType": "video", "EnableAdaptive": true, "TotalCount": 1 // ... 更多字段 }
无论 IVideoModel 是通过哪些方式构造的,您都需要将其封装为播放器 SDK 可识别的 VideoModelSource 对象。
public static VideoModelSource createVideoModelSource(IVideoModel videoModel) { // 构造 VideoModelSource final VideoModelSource videoModelSource = new VideoModelSource.Builder() // 视频 ID,必须与 IVideoModel 中设置的 vid 保持一致。 .setVid(videoModel.getVideoRefStr(VideoRef.VALUE_VIDEO_REF_VIDEO_ID)) // 传入上一步创建的 IVideoModel 对象。**必须设置**。 .setVideoModel(videoModel) // (可选)指定起播清晰度。若要实现智能起播选档或 ABR,则无需设置此项。 .setResolution(Resolution.Standard) .build(); return videoModelSource; }