VOD(点播)

一个文件进来,每一档画质出去。

视频在文件存在之前就已创建,所以它的地址先被定下来。本页讲如何创建、如何上传文件、产物是什么、私有播放,以及计量的是什么。

01

创建视频

一个资产就是一个视频。它在文件之前就存在:创建时就定下它将来播放的地址,因此上传还在进行时,你就可以把这个地址写进页面。

创建一个资产
curl -X POST https://dash.yunzheng.space/api/v1/vod/assets \
  -H "Authorization: Bearer $ORBIT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Launch keynote","visibility":"unlisted"}'
字段含义
title视频标题,最多 200 个字符。
visibilitypublicunlisted(默认)或 private。只有 private 需要签名地址。
tags供你自己检索使用,不会随视频对外发布。
description可选,最多 2000 个字符。
unlisted 的含义是地址不可被猜到,它不是访问控制:拿到地址的人都能观看。真正做访问控制的是 private
02

上传文件

三步:先声明文件多大,再逐片上传,最后声明结束。声明大小是必填的,并在收尾时校验 —— 与声明不符的文件会被拒绝,而不是转码到一半。

开始、上传、收尾
B=https://dash.yunzheng.space/api/v1/vod/assets/$ID

curl -X POST $B/upload \
  -H "Authorization: Bearer $ORBIT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"size":734003200,"content_type":"video/mp4"}'
# -> {"upload_id":"ovu_...","part_size":8388608}

split -b 8388608 video.mp4 part-
n=1; for f in part-*; do
  curl -X PUT $B/upload/$UPLOAD_ID/parts/$n \
    -H "Authorization: Bearer $ORBIT_TOKEN" --data-binary @$f
  n=$((n+1))
done

curl -X POST $B/upload/$UPLOAD_ID/complete \
  -H "Authorization: Bearer $ORBIT_TOKEN"
# -> {"asset_id":"ovd_...","job_id":"ovj_..."}

每一片的应答都会带上已经到达的分片列表,因此中断的上传只需补发缺的那几片。分片可以乱序发送;除最后一片外,每片的大小都必须等于返回给你的 part_size

控制台做的就是这件事。把文件拖到 VOD 页面,发出的是同样的三个请求,上传期间显示进度条,失败时在出问题的那一片上提供「继续」。
03

产物是什么

每个视频一套 HLS 梯度:你上传的分辨率,以及它之下的标准档位,档数不超过套餐允许值。视频为 H.264,音频为 128 kbit/s 的 AAC,切成 6 秒一片,并设置 independent_segments —— 正是这一点让播放器切换画质时画面不中断。

套餐最高画质每个视频的档数
Free720p2
Pro1080p4
Business2160p(4K)6
Unlimited2160p(4K)6
我们不做向上拉伸。720p 的文件即使在 Business 套餐上,最高仍然是 720p —— 上限是上限,不是目标。

封面取自首帧;首帧接近全黑时改用稍后的一帧。reprocess 会以原始文件为源重新生成梯度,套餐变更后应当使用它;新梯度完成之前,当前的一套照常播放。

查询已有的档位
curl https://dash.yunzheng.space/api/v1/vod/assets/$ID/renditions \
  -H "Authorization: Bearer $ORBIT_TOKEN"
04

播放

公开与不公开的视频都在同一个地址播放,而且这个地址不会变:

播放地址与封面
https://vod.yunzheng.space/a/<asset_id>/master.m3u8
https://vod.yunzheng.space/a/<asset_id>/poster.jpg

任何支持 HLS 的播放器都能直接用这个地址。我们的播放器额外提供清晰度菜单、画中画与统计面板,只需两行:

嵌入播放器
<script src="https://vod.yunzheng.space/v1.js"></script>
<div id="p"></div>
<script>
  OrbitPlayer.mount(document.getElementById('p'), {
    src: 'https://vod.yunzheng.space/a/<asset_id>/master.m3u8',
    vod: true, latency: 'standard'
  })
</script>

private 的视频在那个地址上会被拒绝。改为申请一个签名地址:它带有过期时间与签名,过期之后就不再应答。

一个有效期一小时的签名地址
curl -X POST https://dash.yunzheng.space/api/v1/vod/assets/$ID/playback \
  -H "Authorization: Bearer $ORBIT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ttl_s":3600}'
# -> {"master_url":"https://vod.yunzheng.space/a/ovd_.../master.m3u8?exp=...&sig=...",
#     "expires_at":"..."}

如果想在自己的后端签名 —— 每位观众一条链接,且不必向我们发请求 —— 就持有一把播放密钥。密钥在创建时出现一次,之后无法再读取;吊销密钥会让所有已用它签过的链接立即失效,包括观众正打开着的那一条。

播放密钥
curl -X POST   https://dash.yunzheng.space/api/v1/vod/keys -H "Authorization: Bearer $ORBIT_TOKEN"
curl           https://dash.yunzheng.space/api/v1/vod/keys -H "Authorization: Bearer $ORBIT_TOKEN"
curl -X DELETE https://dash.yunzheng.space/api/v1/vod/keys/$KEY_ID -H "Authorization: Bearer $ORBIT_TOKEN"
05

计量什么

限额含义
视频数同时可以拥有多少个资产
存储原始文件、由它生成的每一档画质,以及封面
每月转码时长已编码的视频分钟数,每一档各计一次
每月分发流量从边缘发往观众的流量
最高画质按套餐决定的梯度上限
每个视频的档数梯度最多有几级

删除视频会立即释放存储,播放地址也在同一刻停止应答。重新转码会再计一次,因为那是又一次编码。

用量显示在控制台 VOD 页面的资源库旁边,与套餐允许值对照;GET /v1/account/quota 里也是同一组名字。
继续

相关文档

开始使用

Orbit 账户的组织方式、控制台各处的功能,以及从登录到让我们的网络开始应答一个域名的最短路径。

DNS 托管

建区、把注册商的 NS 指向我们、管理记录。含加权应答、带健康检查的记录、顶点 ALIAS 与区文件导入。

接入主机名

整域委派、单主机名委派,或加一条 CNAME 而完全不动现有 DNS。三者各自的代价与适用场景。

← 全部文档