生成边转边播播放列表能够对视频生成标准HLS协议的m3u8播放列表文件,无需提前生成TS文件就可立即播放且按播放进度动态转码。与传统离线转码相比,显著缩短了转码等待时间,且按需转码能大幅降低转码和存储成本。
使用场景
网盘:用户上传视频到网盘,各种网盘客户端立即能根据网络情况选择不同的分辨率进行播放。既保证了播放的实时性,又能确保视频在不同设备上的兼容性。网盘中大部分视频都是冷视频,冷视频没有被用户播放不会触发转码,降低存储成本。
聊天软件视频预览:在即时通讯或社交媒体平台中,发送方把视频发送完毕(发送到服务端存储完成),接收方立刻可以开始播放视频,提高交流的实时性。历史聊天记录中长期不被观看的视频,转码生成的视频文件可以定期清理,再次播放时可立刻播放。
网络论坛与博客交流:在这些平台分享视频时,使用边转边播技术,使得其他用户无需等待视频转码完成就可以观看,同时保持视频内容的流畅性、清晰度和兼容性。
注意事项
生成播放列表需要使用到OSS的同步数据处理能力(x-oss-process)。请在OSS配额中心申请“开启新版本IMM Get数据处理能力”和“开启新版本IMM Post数据处理能力”。
使用边转边播前,需要先绑定IMM Project。关于控制台和API如何绑定,请参见快速入门和AttachOSSBucket。
不支持匿名访问。
必须拥有IMM处理所需的相关权限。更多信息,请参见权限。
更多注意事项请参见IMM边转边播功能说明和IMM生成播放列表API。
参数说明
操作说明:hls/m3u8
具体参数如下表所示:
参数 | 类型 | 是否必须 | 描述 |
ss | int | 否 | 生成播放列表的起始时间点,单位为毫秒(ms)。取值范围如下:
说明 通过与参数t一同设置可以对源视频的部分内容生成播放列表。 |
t | int | 否 | 生成播放列表的转码时长。单位为毫秒(ms),取值范围如下:
说明 当设定参数所对应的时间点超过源视频结尾时,按默认值处理。 |
ta | int | 否 | 触发边转边播时向前转码的ts文件数量。默认向前转码2分钟时长的视频。 示例:st为10000,则ta默认为12。您可以指定该参数控制异步向前转码的数量,取值范围为[10,30]。 |
st | int | 否 | 单个ts文件的切片时长。单位为毫秒(ms),默认为10000,取值范围为[5000,15000]。 |
initd | int | 否 | 生成播放列表时初始转码的时长,单位为毫秒(ms),默认值为30000。
说明 该参数主要用于加快视频初次播放的等待时间,提升播放体验。若您需要替换传统VOD业务场景则可尝试初始转码整段视频。 |
vcodec | string | 否 | 视频codec(编码格式)。取值:
|
fps | float | 否 | 视频帧率,默认与源视频一致。 |
fpsopt | int | 否 | 视频帧率选项。取值:
说明 该参数需要与参数fps一同设置。 |
pixfmt | string | 否 | 像素格式,默认与源视频一致。取值范围如下:
|
s | string | 否 | 输出视频的分辨率,格式为
|
sopt | string | 否 | 分辨率选项。取值:
|
scaletype | string | 否 | 缩放模式。取值范围如下:
说明 该参数需要与参数s一同设置。 |
arotate | int | 否 | 自适应分辨率方向。取值:
|
vb | int | 否 | 视频流码率,单位为比特每秒(bit/s)。 如果crf、vb都不填,则crf默认值是23;如果设置了vbopt,则vb参数必填。 |
vbopt | int | 否 | 视频码率选项。取值范围如下:
|
crf | float | 否 | 指定恒定质量模式。与参数vb互斥,取值范围为[0,51],数值越大画质越差,建议取值范围为[18,38]。如果未填写crf、vb,默认值是23。 |
maxrate | int | 否 | 动态码率下限定最大码率。使用该参数时,必须指定参数bufsize。 说明 该参数需要与参数crf一起使用才有效。 |
bufsize | int | 否 | 动态码率下解码缓存大小,单位为比特每秒(bit/s)。 说明 该参数需要与参数crf一起使用才有效。 |
an | int | 否 | 是否禁用音频流。取值:
|
acodec | string | 否 | 音频编码方式。取值为:acc。 |
ar | int | 否 | 音频采样率。单位为赫兹(Hz)。默认保持源音频的采样频率。取值范围:
|
ac | int | 否 | 声道数。默认保持源音频的声道数。取值范围:[1,8]。 |
aq | int | 否 | 音频质量,与参数ab互斥,取值范围:0~100(值越大质量越高)。 |
ab | int | 否 | 音频码率,与参数aq互斥,单位为比特每秒(bit/s)。取值范围:1000~10000000。 |
abopt | int | 否 | 音频码率选项。取值:
|
生成边转边播播放列表时也会用到sys/saveas
参数。更多信息,请参见另存为。
使用步骤
使用边转边播分为以下两个步骤:
生成播放列表之后,您也可以参考IMM文档的边转边播介绍来操作播放。
1. 将视频生成边转边播播放列表
转码信息
转码前
视频格式:AVI
视频名称:oss://video-demo/example.avi
视频起始位置:跳过前面15秒
视频转码长度:1800秒
处理方式:生成播放列表
转码后
转码分片大小:10秒
预转视频长度:30秒
视频信息
视频流格式:H.264
视频分辨率:1280x720
视频帧率:25 fps
视频码率:2 Mbps
音频信息
音频流格式:AAC
音频码率:128 Kbps
文件存储路径前缀:oss://outbucket/outobjprefix/media
请求示例
POST /example.avi?x-oss-process HTTP/1.1
Host: video-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: OSS qn6q**************:77Dv****************
x-oss-process=hls/m3u8,ss_15000,t_1800000,vcodec_h264,fps_25,fpsopt_1,s_1280x720,sopt_1,scaletype_fit,arotate_1,vb_2000000,vbopt_1,acodec_aac,ar_44100,ac_2,ab_128000,abopt_1,st_10000,initd_30000|sys/saveas,o_b3V0b2JqcHJlZml4L21lZGlh,b_b3V0YnVja2V0
响应示例
HTTP/1.1 200 OK
Server: AliyunOSS
Date: Wed, 25 May 2022 12:43:57 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 161
Connection: keep-alive
x-oss-request-id: 628E2481184E20F26C000009
x-oss-transfer-acc-type: acc-none
x-oss-data-location: oss-cn-hangzhou-a
ETag: "D0F162350DA037F4DC2A142B2E116BD0"
Last-Modified: Wed, 25 May 2022 12:20:34 GMT
x-oss-object-type: Normal
x-oss-hash-crc64ecma: 2040549661341440100
x-oss-storage-class: Standard
x-oss-server-time: 12437
{"Duration":1800,"RequestId":"********-37E6-5996-8425-********","VideoPlaylist":[{"FrameRate":"25","Resolution":"1280x720","Token":"f93c43079**********1269608ebc86e","URI":"oss://outbucket/outobjprefix/media.m3u8"}]}
2. 使用hls/sign签名边转边播
OSS对音视频数据的访问提供了动态签名机制,即只需在首次访问m3u8文件时在URL中添加x-oss-process=hls/sign,live_1
, OSS将对返回的播放列表中的所有ts地址自动按照与m3u8完全相同的方式进行签名。
hls/sign签名方式:
# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 填写Bucket所在地域对应的Endpoint。请按实际情况填写。
endpoint = 'yourEndpoint'
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 目标Bucket名称。
bucket_name = 'your-oss-bucket-name'
# output/media.m3u8填写生成的播放列表名称。
key = 'output/media.m3u8'
# 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
# 必须使用oss2.AuthV2的签名方式。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', bucket_name)
# x-oss-process的处理方式为hls/sign,live_1。
params = {}
params.update({oss2.Bucket.PROCESS: 'hls/sign,live_1'})
# 签名URL。
# 生成签名URL时,OSS默认会对Object完整路径中的正斜线(/)进行转义,从而导致生成的签名URL无法直接使用。
# 设置slash_safe为True,OSS不会对Object完整路径中的正斜线(/)进行转义,此时生成的签名URL可以直接使用。
url = bucket.sign_url('GET', key, 7200, params=params, slash_safe=True)
# 生成的URL可以直接在HLS播放器中播放。
print(url)
原始m3u8内容
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:10.0,
media-c14709808479b31566b50f2f8b93fe1a-0.ts
#EXTINF:10.0,
media-c14709808479b31566b50f2f8b93fe1a-1.ts
#EXTINF:10.0,
media-c14709808479b31566b50f2f8b93fe1a-2.ts
#EXTINF:10.0,
media-c14709808479b31566b50f2f8b93fe1a-3.ts
#EXT-X-ENDLIST
使用hls/sign签名后返回的内容:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:10.000,
media-c14709808479b31566b50f2f8b93fe1a-0.ts?x-oss-process=if_status_eq_404{hls/ts,from_b3V0cHV0L21lZGlhLm0zdTg}&x-oss-expires=1710457284&x-oss-signature-version=OSS2&x-oss-access-key-id=****fEAub****&x-oss-signature=****VR3gy****
#EXTINF:10.000,
media-c14709808479b31566b50f2f8b93fe1a-1.ts?x-oss-process=if_status_eq_404{hls/ts,from_b3V0cHV0L21lZGlhLm0zdTg}&x-oss-expires=1710457284&x-oss-signature-version=OSS2&x-oss-access-key-id=****fEAub****&x-oss-signature=****VR3gy****
#EXTINF:10.000,
media-c14709808479b31566b50f2f8b93fe1a-2.ts?x-oss-process=if_status_eq_404{hls/ts,from_b3V0cHV0L21lZGlhLm0zdTg}&x-oss-expires=1710457284&x-oss-signature-version=OSS2&x-oss-access-key-id=****fEAub****&x-oss-signature=****VR3gy****
#EXTINF:10.000,
media-c14709808479b31566b50f2f8b93fe1a-3.ts?x-oss-process=if_status_eq_404{hls/ts,from_b3V0cHV0L21lZGlhLm0zdTg}&x-oss-expires=1710457284&x-oss-signature-version=OSS2&x-oss-access-key-id=****fEAub****&x-oss-signature=****VR3gy****
#EXT-X-ENDLIST
使用SDK
生成边转边播播放列表仅支持同步处理,SDK使用方法请参见使用SDK。
常见问题
输出文件包括哪些?
我们会根据您指定的输入路径前缀生成m3u8文件和ts文件。m3u8文件立刻生成。如果您指定了预转视频长度,会异步生成预转长度的ts文件(例如您指定了预转长度是30秒,切片长度为10秒,则生成3个ts文件)。未指定预转的部分会在视频播放时才会按需触发异步转码(例如1:视频从未播放,则不会对未指定预转的部分生成ts文件;例如2:视频从15分钟的地方开始播放,只会从15分钟的位置开始转码)。生成文件的目录树如下:
.
├── outobjprefix.m3u8
├── outobjprefix-92376fbb-171f-4259-913f-705f7ee02f2s-0.ts
├── outobjprefix-92376fbb-171f-4259-913f-705f7ee02f2s-1.ts
├── outobjprefix-92376fbb-171f-4259-913f-705f7ee02f2s-2.ts
├── outobjprefix-92376fbb-171f-4259-913f-705f7ee02f2s-3.ts
已经生成的ts文件手工删除后能正常播放吗?
可以。只要视频源文件和m3u8播放列表未被删除,手动删除部分或全部ts文件后仍能正常播放,因为当m3u8播放列表再次被请求时,会触发重新生成ts文件。这种方式允许对之前已播放但长时间未被观看的视频的ts文件进行清理,以此减少存储成本,而不影响视频将来的重新播放。
能使用非边转边播的m3u8文件做边转边播吗?
不可以。不能使用非边转边播生成的m3u8文件实现边转边播功能。