生成邊轉邊播播放列表能夠對視頻生成標準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文件實現邊轉邊播功能。