生成播放列表

生成边转边播播放列表能够对视频生成标准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)。取值范围如下:

  • 0(默认值)或不填表示从源视频起始时间点开始。

  • 大于0表示从源视频所设置的时间点开始。

说明

通过与参数t一同设置可以对源视频的部分内容生成播放列表。

t

int

生成播放列表的转码时长。单位为毫秒(ms),取值范围如下:

  • 0(默认值)或不填表示持续到源视频结尾。

  • 大于0表示从生成播放列表的起始时间点持续所设置的时长。

说明

当设定参数所对应的时间点超过源视频结尾时,按默认值处理。

ta

int

触发边转边播时向前转码的ts文件数量。默认向前转码2分钟时长的视频。

示例:st为10000,则ta默认为12。您可以指定该参数控制异步向前转码的数量,取值范围为[10,30]。

st

int

单个ts文件的切片时长。单位为毫秒(ms),默认为10000,取值范围为[5000,15000]。

initd

int

生成播放列表时初始转码的时长,单位为毫秒(ms),默认值为30000。

  • 当所设置的时长为0时,不预转。

  • 当设置为负数或超过源视频时长时,将初始转码整段视频。

  • 当所设置的时长位于TS文件中间时,将持续转码到TS文件结束位置。

说明

该参数主要用于加快视频初次播放的等待时间,提升播放体验。若您需要替换传统VOD业务场景则可尝试初始转码整段视频。

vcodec

string

视频codec(编码格式)。取值:

  • h264(默认值):h264编码格式。

  • h265:h265编码格式。

fps

float

视频帧率,默认与源视频一致。

fpsopt

int

视频帧率选项。取值:

  • 0:始终使用目标帧率。

  • 1(默认值):源视频帧率小于fps时使用源视频帧率。

  • 2:源视频帧率小于fps时返回失败。

说明

该参数需要与参数fps一同设置。

pixfmt

string

像素格式,默认与源视频一致。取值范围如下:

  • yuv420p

  • yuv422p

  • yuv444p

  • yuv420p10le

  • yuv422p10le

  • yuv444p10le

s

string

输出视频的分辨率,格式为宽 x 高,默认与源视频分辨率一致。

  • 格式为w x h,即宽 x 高。

  • 宽和高的取值应为2的倍数,且取值范围为64~4096。例如:4096x4096、64x64等。

sopt

string

分辨率选项。取值:

  • 0:始终使用设置的目标视频分辨率。

  • 1(默认值):源视频分辨率面积小于设置的目标视频分辨率面积时使用源视频分辨率。

  • 2:源视频分辨率面积小于设置的目标视频分辨率面积时返回失败。

scaletype

string

缩放模式。取值范围如下:

  • stretch(默认值):固定宽高或长短边,强制缩放,拉伸以填满空白部分。

  • crop:等比缩放,缩放为延伸出指定宽高或长短边的矩形框外的最小分辨率,然后将超出的部分进行居中裁剪。

  • fill:等比缩放,缩放为指定宽高或长短边的矩形内的最大分辨率,然后使用黑色居中填充空白部分。

  • fit:等比缩放,缩放为指定宽高或长短边的矩形内的最大分辨率。

说明

该参数需要与参数s一同设置。

arotate

int

自适应分辨率方向。取值:

  • 0(默认值):关闭。

  • 1:打开。

vb

int

视频流码率,单位为比特每秒(bit/s)。

如果crf、vb都不填,则crf默认值是23;如果设置了vbopt,则vb参数必填。

vbopt

int

视频码率选项。取值范围如下:

  • 0:始终使用设置的目标视频码率。

  • 1(默认值):源视频码率小于设置的目标视频码率时使用源视频码率。

  • 2:源视频码率小于设置的目标视频码率时返回失败。

crf

float

指定恒定质量模式。与参数vb互斥,取值范围为[0,51],数值越大画质越差,建议取值范围为[18,38]。如果未填写crf、vb,默认值是23。

maxrate

int

动态码率下限定最大码率。使用该参数时,必须指定参数bufsize。

说明

该参数需要与参数crf一起使用才有效。

bufsize

int

动态码率下解码缓存大小,单位为比特每秒(bit/s)。

说明

该参数需要与参数crf一起使用才有效。

an

int

是否禁用音频流。取值:

  • 0(默认值):不禁用。

  • 1:禁用。

acodec

string

音频编码方式。取值为:acc。

ar

int

音频采样率。单位为赫兹(Hz)。默认保持源音频的采样频率。取值范围:

  • 8000

  • 11025

  • 12000

  • 16000

  • 22050

  • 24000

  • 32000

  • 44100

  • 48000

  • 88200

  • 96000

ac

int

声道数。默认保持源音频的声道数。取值范围:[1,8]。

aq

int

音频质量,与参数ab互斥,取值范围:0~100(值越大质量越高)。

ab

int

音频码率,与参数aq互斥,单位为比特每秒(bit/s)。取值范围:1000~10000000。

abopt

int

音频码率选项。取值:

  • 0:始终使用目标音频码率。

  • 1(默认值):源视频帧率小于ab时使用源视频码率。

  • 2:源视频帧率小于ab时返回失败。

说明

生成边转边播播放列表时也会用到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文件实现边转边播功能。