直播錄制
直播錄制是指將推送的直播流實(shí)時(shí)轉(zhuǎn)換成TS媒體切片后保存到OSS或VOD中的過(guò)程。它將直播內(nèi)容封裝成TS、M3U8、MP4或FLV等格式的視頻文件,并支持H264、HEVC、MPEG4的視頻編碼和AAC、MP3的音頻編碼。用戶(hù)可以通過(guò)直播控制臺(tái)或API接口選擇不同的錄制方式,包括自動(dòng)錄制、定時(shí)任務(wù)錄制、按需錄制和手動(dòng)錄制。錄制完成后,用戶(hù)可以通過(guò)直播控制臺(tái)查詢(xún)錄制文件,設(shè)置錄制文件回調(diào)或進(jìn)行實(shí)時(shí)處理。本文為您詳細(xì)介紹直播錄制相關(guān)信息(包括錄制原理、錄制文件的存儲(chǔ)、錄制方法等),您可以參考本章節(jié)完成直播錄制操作。
直播錄制原理
直播錄制的過(guò)程,是通過(guò)拉取您推上來(lái)的直播流,將音視頻封裝成單獨(dú)的一個(gè)個(gè)媒體切片(封裝格式為T(mén)S),然后存入您指定的OSS bucket或者存入到點(diǎn)播系統(tǒng)生成點(diǎn)播文件。直播錄制在工作時(shí)遵循以下原則:
直播錄制只修改音視頻的封裝格式(RTMP/FLV轉(zhuǎn)成TS),絕不修改音視頻內(nèi)容(即編碼層內(nèi)容)。舉個(gè)例子,如果您推上來(lái)的直播流是花屏的,那錄制下來(lái)的也是花屏的。
直播錄制有權(quán)限往用戶(hù)bucket寫(xiě)入錄制文件,但不會(huì)且沒(méi)有權(quán)限修改/刪除用戶(hù)bucket的任務(wù)文件(包括已寫(xiě)入的錄制文件)。用戶(hù)bucket中的錄制文件,完全由您自己管理。
錄制存儲(chǔ)方式
同一路直播流錄制到VOD和錄制到OSS Bucket二者不能同時(shí)生效,只能選擇其中一種方式。
視頻直播提供以下兩種錄制文件的存儲(chǔ)方式,您可以根據(jù)需要進(jìn)行選擇:
錄制存儲(chǔ)至OSS:OSS Bucket必須與播放域名的直播中心同地域,不支持跨地域錄制。
錄制存儲(chǔ)至VOD:將直播內(nèi)容進(jìn)行錄制存儲(chǔ),并轉(zhuǎn)入視頻點(diǎn)播系統(tǒng)中,按點(diǎn)播錄制規(guī)則生成點(diǎn)播文件。視頻點(diǎn)播支持使用云剪輯功能對(duì)直播流的內(nèi)容進(jìn)行剪輯加工,實(shí)現(xiàn)視頻直播與短視頻的內(nèi)容聯(lián)動(dòng)。
錄制文件的封裝格式
直播錄制支持將直播流錄制成TS/M3U8、MP4、FLV封裝格式的視頻文件。但是不管是哪種封裝格式,直播錄制都會(huì)先將直播流切片成一個(gè)個(gè)的TS切片,然后再合成對(duì)應(yīng)封裝格式的錄制文件。
對(duì)于M3U8,直播錄制會(huì)將TS和M3U8都寫(xiě)入用戶(hù)的bucket(因?yàn)镸3U8只是HLS協(xié)議中的索引文件,音視頻數(shù)據(jù)仍然在TS中);而對(duì)于MP4和FLV,用戶(hù)bucket中只會(huì)有合成后的MP4和FLV切片。
限制條件
錄制存儲(chǔ)至OSS
錄制存儲(chǔ)至OSS的前提條件是您已創(chuàng)建OSS Bucket,且OSS Bucket必須與播放域名的直播中心同地域,不支持跨地域錄制。具體操作,請(qǐng)參見(jiàn)創(chuàng)建OSS Bucket。
正常情況下,開(kāi)通直播服務(wù)時(shí),您已自動(dòng)授權(quán)“允許直播服務(wù)寫(xiě)入用戶(hù)OSS”,因此直播錄制寫(xiě)入您指定的bucket時(shí)不存在權(quán)限問(wèn)題。如果該權(quán)限意外被刪除,您可以參考以下方法重新配置:
通過(guò)控制臺(tái)配置:您需要授權(quán)視頻直播可將視頻內(nèi)容寫(xiě)入OSS產(chǎn)品的權(quán)限,授權(quán)后才能將視頻存儲(chǔ)至指定的OSS bucket中。具體操作,請(qǐng)參見(jiàn)配置直播寫(xiě)入OSS權(quán)限。
通過(guò)RAM進(jìn)行權(quán)限配置:詳情信息,請(qǐng)參見(jiàn)創(chuàng)建RAM用戶(hù)并授權(quán)。
錄制存儲(chǔ)至VOD
錄制存儲(chǔ)至VOD的前提條件:您需要先開(kāi)通視頻點(diǎn)播服務(wù),且開(kāi)通點(diǎn)播服務(wù)的區(qū)域必須與播放域名的直播中心同地域才能將視頻存儲(chǔ)至VOD。視頻點(diǎn)播服務(wù)詳細(xì)操作,請(qǐng)參見(jiàn)開(kāi)通視頻點(diǎn)播。
音視頻編碼格式
由于直播錄制需要先將直播流切分成TS文件,因此您推上來(lái)的直播流的音視頻編碼格式必須滿(mǎn)足TS封裝格式的要求。根據(jù)FLV標(biāo)準(zhǔn)和ISO/IEC 13818-1標(biāo)準(zhǔn),直播錄制目前僅支持以下編碼格式:
視頻:H264、HEVC、MPEG4
音頻:AAC、MP3
說(shuō)明如果直播流包含了非以上格式編碼的音視頻,直播錄制可能會(huì)出現(xiàn):無(wú)法生成錄制文件、錄制黑屏、錄制沒(méi)有聲音,以及其他一些無(wú)法預(yù)見(jiàn)的異常情況。
異常的直播流
對(duì)于正常的直播流(沒(méi)有不支持的編碼格式、幀率穩(wěn)定、時(shí)間戳單調(diào)線(xiàn)性增長(zhǎng)),直播錄制均能正常生成錄制文件。當(dāng)然,對(duì)于偶爾幀率不穩(wěn)定,時(shí)間戳跳變的流,直播錄制也能做出一定的兼容,保證錄制文件的正常生成。
但如果推上來(lái)的直播流存在嚴(yán)重異常(長(zhǎng)時(shí)間沒(méi)有視頻幀,時(shí)間戳增長(zhǎng)沒(méi)有規(guī)律,音視頻頭缺失等),直播錄制可能無(wú)法保證正常生成錄制文件。
不同錄制方式及使用場(chǎng)景
視頻直播提供以下錄制方式,您可根據(jù)具體的場(chǎng)景進(jìn)行選擇和使用:
錄制方式 | 使用場(chǎng)景 | 配置方式 | 存儲(chǔ)位置 |
錄制時(shí)可精確到某一路流。您可以輸入指定的域名、應(yīng)用名或流名稱(chēng),錄制某一路直播流。 |
| 支持兩種存儲(chǔ)方式:
| |
您可以通過(guò)API控制錄制的開(kāi)始與結(jié)束時(shí)間,在您指定的時(shí)間內(nèi)進(jìn)行錄制。 | 調(diào)用API接口 | 僅支持錄制存儲(chǔ)至OSS | |
您可以配置一個(gè)回調(diào),通過(guò)回調(diào)的方法精準(zhǔn)控制每一路流的錄制方式。 | 調(diào)用API接口 | 僅支持錄制存儲(chǔ)至OSS | |
默認(rèn)不錄制。您可以通過(guò)調(diào)用接口來(lái)進(jìn)行手動(dòng)錄制。 | 調(diào)用API接口 | 僅支持錄制存儲(chǔ)至OSS |
按域名、AppName、StreamName多級(jí)別自動(dòng)錄制
直播錄制支持按域名、AppName、StreamName多級(jí)別的方式進(jìn)行錄制。您可以指定域名、應(yīng)用名或流名稱(chēng),錄制某個(gè)域名下或App下所有的直播流,也可以精確錄制某一路直播流。
配置存儲(chǔ)至OSS或存儲(chǔ)至VOD的錄制模板時(shí)您可以配置多個(gè)錄制模板,但是如果出現(xiàn)一路直播流同時(shí)可以匹配到多個(gè)錄制模板時(shí),錄制模板生效存在優(yōu)先級(jí),具體優(yōu)先級(jí)如下(數(shù)值越小,優(yōu)先級(jí)越高):
優(yōu)先級(jí) | DomainName | AppName | StreamName |
1 | ? | ? | ? |
2 | ? | ? | * |
3 | ? | * | * |
? 代表通過(guò)控制臺(tái)或API配置自動(dòng)錄制規(guī)則時(shí)對(duì)應(yīng)參數(shù)有值,且值不為*,* 代表對(duì)應(yīng)參數(shù)值為*。
同一路直播流不能同時(shí)選擇錄制到OSS和錄制到VOD,只能選擇其中一種方式。具體實(shí)現(xiàn)方式如下:
錄制存儲(chǔ)至OSS
通過(guò)視頻直播控制臺(tái):
具體操作,請(qǐng)參見(jiàn)錄制存儲(chǔ)至OSS。
API調(diào)用流程:
配置錄制規(guī)則,調(diào)用接口請(qǐng)參見(jiàn)AddLiveAppRecordConfig。
進(jìn)行推流,詳細(xì)內(nèi)容請(qǐng)參見(jiàn)推流、拉流與播流。
其他相關(guān)API參考:
API名稱(chēng)
說(shuō)明
刪除App級(jí)別錄制配置,如果不再需要某項(xiàng)規(guī)則,可以通過(guò)該接口刪除。
查詢(xún)所有配置的規(guī)則列表.
錄制存儲(chǔ)至VOD
通過(guò)視頻直播控制臺(tái):
具體操作,請(qǐng)參見(jiàn)錄制存儲(chǔ)至VOD。
API調(diào)用流程:
配置錄制規(guī)則,調(diào)用接口請(qǐng)參見(jiàn)AddLiveRecordVodConfig。
進(jìn)行推流,詳細(xì)內(nèi)容請(qǐng)參見(jiàn)推流、拉流與播流。
其他相關(guān)API參考:
API名稱(chēng)
說(shuō)明
如果不再需要直播錄制轉(zhuǎn)點(diǎn)播配置,可以通過(guò)該接口刪除。
查詢(xún)直播轉(zhuǎn)點(diǎn)播所有配置列表。
按定時(shí)任務(wù)自動(dòng)錄制
該功能僅針對(duì)流級(jí)別的配置生效(即配置中StreamName字段不為空才生效)。
如果您希望在指定的開(kāi)始時(shí)間和結(jié)束時(shí)間內(nèi)對(duì)一路直播流進(jìn)行定時(shí)錄制,可以通過(guò)調(diào)用API的方式來(lái)實(shí)現(xiàn)定時(shí)任務(wù)的自動(dòng)錄制。
API調(diào)用流程:
配置自動(dòng)錄制規(guī)則,調(diào)用接口請(qǐng)參見(jiàn)AddLiveAppRecordConfig。
進(jìn)行推流,詳細(xì)內(nèi)容請(qǐng)參見(jiàn)推流、拉流與播流。
相關(guān)API參考:
API名稱(chēng) | 說(shuō)明 |
刪除App級(jí)別錄制配置,如果不再需要某項(xiàng)規(guī)則,可以通過(guò)該接口刪除。 | |
查詢(xún)所有配置的規(guī)則列表. |
實(shí)踐示例
例如:創(chuàng)建DomainName為example.com
,AppName為liveApp****
,StreamName為liveStream****
,北京時(shí)間為2019-02-15 09:00:00到2019-02-15 21:00:00的錄制任務(wù)。同時(shí)錄制為M3U8和MP4兩種格式,M3U8格式單個(gè)錄制文件周期默認(rèn)為6小時(shí)(即RecordFormat.1.CycleDuration不傳值),MP4格式單個(gè)錄制文件的錄制周期設(shè)置為半小時(shí),錄制到oss-cn-shanghai.aliyuncs.com名為liveBucket****的bucket中:
調(diào)用AddLiveAppRecordConfig接口,參數(shù)如下:
/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &OssBucket=liveBucket**** &OssEndpoint=oss-cn-shanghai.aliyuncs.com &RecordFormat.1.Format=m3u8 &RecordFormat.2.Format=mp4 &RecordFormat.2.CycleDuration=1800 &StartTime=2019-02-15T01:00:00Z &EndTime=2019-02-15T13:00:00Z &<公共請(qǐng)求參數(shù)>
說(shuō)明StartTime和EndTime字段填的是UTC時(shí)間(假設(shè)您本地為北京時(shí)間,UTC時(shí)間=北京時(shí)間-8),請(qǐng)注意和本地時(shí)區(qū)的對(duì)應(yīng)。
推流。
說(shuō)明如果指定了錄制時(shí)間段,在該時(shí)間段內(nèi)如果沒(méi)有推流,自然不會(huì)錄制。
限定時(shí)間段的配置規(guī)則是一次性的,即當(dāng)指定的時(shí)間段過(guò)去之后,該規(guī)則不會(huì)再觸發(fā)。
按需錄制
按需錄制的原理是當(dāng)直播流推流上來(lái)之后,直播錄制服務(wù)會(huì)發(fā)送一條HTTP回調(diào)給您事先設(shè)定的后臺(tái)服務(wù),通過(guò)該回調(diào)的返回內(nèi)容決定是否錄制這條直播流,并且可以動(dòng)態(tài)的修改錄制格式和錄制周期。
系統(tǒng)交互如下圖所示,您需要開(kāi)發(fā)圖中的App業(yè)務(wù)服務(wù),接收HTTP回調(diào),并根據(jù)您自身的業(yè)務(wù)邏輯決定是否錄制。
按需錄制可以通過(guò)調(diào)用API 的方式來(lái)實(shí)現(xiàn):
調(diào)用接口添加錄制配置配置錄制規(guī)則。其中OnDemand字段填1,表示通過(guò)HTTP回調(diào)開(kāi)啟按需錄制。
調(diào)用接口AddLiveRecordNotifyConfig,設(shè)置OnDemandUrl字段。
推流。
App業(yè)務(wù)服務(wù)接收到該推流的按需錄制回調(diào),根據(jù)自身業(yè)務(wù)決定是否錄制,返回內(nèi)容。
直播錄制服務(wù)根據(jù)按需錄制回調(diào)返回的結(jié)果,啟動(dòng)錄制或不啟動(dòng)錄制。
涉及的API包括:
API名稱(chēng) | 描述 |
配置錄制規(guī)則。 | |
如果不再需要某項(xiàng)規(guī)則,可以通過(guò)該接口刪除。 | |
查詢(xún)所有配置的規(guī)則。 | |
配置某個(gè)域名下的錄制回調(diào),包括事件回調(diào)和按需錄制回調(diào)。 | |
如果不再需要某個(gè)域名的錄制回調(diào),可以通過(guò)該接口刪除。 | |
查詢(xún)某個(gè)域名的錄制回調(diào)。 | |
更新某個(gè)域名的錄制回調(diào)。 | |
按需錄制回調(diào)給您的HTTP消息定義。 |
實(shí)踐示例:
調(diào)用AddLiveAppRecordConfig接口,配置指定域名為
example.com
,AppName為liveBucket****
下的所有直播流自動(dòng)錄制:/?AppName=liveApp**** &DomainName=example.com &OssBucket=liveBucket**** &OssEndpoint=oss-cn-shanghai.aliyuncs.com &RecordFormat.1.Format=m3u8 &<公共請(qǐng)求參數(shù)>
調(diào)用AddLiveRecordNotifyConfig接口,設(shè)置OnDemandUrl字段為
http://example.aliyundoc.com
:/?DomainName=example.com &OnDemandUrl=http://example.aliyundoc.com &<公共請(qǐng)求參數(shù)>
推流。
App業(yè)務(wù)服務(wù)接收到的按需錄制回調(diào)為:(詳見(jiàn)按需錄制回調(diào))
GET /?app=liveApp****&domain=example.com&stream=liveStream****&vbitrate=2000&codec=h264 HTTP/1.1 Host: demo.aliyundoc.com User-Agent: Go-http-client/1.1
根據(jù)回調(diào)返回的結(jié)果:(詳見(jiàn)按需錄制回調(diào))
如果收到以下結(jié)果,則進(jìn)行錄制:
{ "ApiVersion" : "1.0", "NeedRecord" : true }
如果收到以下結(jié)果,則不錄制:
{ "ApiVersion" : "1.0", "NeedRecord" : false }
如果沒(méi)有設(shè)置OnDemandUrl,就不會(huì)有按需錄制回調(diào),默認(rèn)行為是不錄制。
在調(diào)用AddLiveRecordNotifyConfig接口,設(shè)置錄制回調(diào)前請(qǐng)先調(diào)用接口AddLiveAppRecordConfig設(shè)置錄制規(guī)則,否則無(wú)法啟動(dòng)錄制任務(wù)。
手動(dòng)錄制
針對(duì)直播錄制您還可以直接通過(guò)手動(dòng)的方式實(shí)現(xiàn)某條直播流的錄制啟動(dòng)。如果某條直播流正在錄制,您也可以通過(guò)手動(dòng)的方式停止該直播流的錄制。
手動(dòng)錄制通過(guò)調(diào)用API實(shí)現(xiàn):
調(diào)用AddLiveAppRecordConfig接口配置錄制規(guī)則。設(shè)置ondemand=7,表示推流后不自動(dòng)錄制。
推流。
調(diào)用RealTimeRecordCommand接口啟動(dòng)錄制。
(如果需要)調(diào)用RealTimeRecordCommand接口停止錄制。
涉及到的API包括:
API名稱(chēng) | 說(shuō)明 |
配置自動(dòng)錄制規(guī)則。 | |
如果不再需要某項(xiàng)規(guī)則,可以通過(guò)該接口刪除。 | |
查詢(xún)所有配置的規(guī)則。 | |
實(shí)時(shí)錄制命令,可控制手動(dòng)啟動(dòng)錄制和手動(dòng)停止錄制。 |
實(shí)踐示例:
手動(dòng)啟動(dòng)錄制。
如果直播流
example.com/liveApp****/liveStream****
正在推流,可以按以下方式調(diào)用RealTimeRecordCommand接口啟動(dòng)錄制:/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &Command=start &<公共請(qǐng)求參數(shù)>
手動(dòng)停止錄制
如果直播流
example.com/liveApp****/liveStream****
正在錄制,可以按以下方式調(diào)用RealTimeRecordCommand接口停止錄制:/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &Command=stop &<公共請(qǐng)求參數(shù)>
如果直播流不存在(沒(méi)有推流),調(diào)用RealTimeRecordCommand接口手動(dòng)啟動(dòng)錄制會(huì)返回失敗。
手動(dòng)啟動(dòng)錄制的直播流如果發(fā)生了斷流,就會(huì)停止錄制,并且重新推流后不會(huì)自動(dòng)啟動(dòng)錄制(如果沒(méi)有配置自動(dòng)錄制)。
錄制文件獲取
直播錄制結(jié)束后,可以通過(guò)以下方法獲取到對(duì)應(yīng)的錄制文件:
方法一:通過(guò)直播控制臺(tái)查看錄制文件。詳細(xì)操作,請(qǐng)參見(jiàn)錄制文件管理。
方法二:通過(guò)調(diào)用DescribeLiveStreamRecordIndexFiles查詢(xún)某個(gè)時(shí)間段內(nèi)的所有錄制索引文件。需注意接口中的StartTime和EndTime字段填的均是UTC+0時(shí)間,請(qǐng)注意和本地時(shí)區(qū)的對(duì)應(yīng)。例如您本地為北京時(shí)間,UTC時(shí)間=北京時(shí)間-8。
http(s)://live.aliyuncs.com/?Action=DescribeLiveStreamRecordIndexFiles &AppName=liveApp**** &DomainName=example.com &EndTime=2017-12-22T08:00:00Z &StartTime=2017-12-21T08:00:00Z &StreamName=liveStream**** &<公共請(qǐng)求參數(shù)>
方法三:通過(guò)調(diào)用AddLiveRecordNotifyConfig接口設(shè)置錄制文件生成回調(diào),每當(dāng)一個(gè)錄制文件生成,都能收到一個(gè)HTTP請(qǐng)求,便于您做一些業(yè)務(wù)上的實(shí)時(shí)處理。具體操作如下:
調(diào)用AddLiveRecordNotifyConfig接口,設(shè)置域名
aliyundoc.com
下直播錄制文件生成事件都回調(diào)到http://example.aliyundoc.com
這個(gè)地址:/?DomainName=aliyundoc.com &NotifyUrl=http://example.aliyundoc.com &<公共請(qǐng)求參數(shù)>
設(shè)置之后,如果一條直播流
aliyundoc.com/live/teststream
生成錄制文件(TS/MP4/FLV),您就會(huì)收到以下內(nèi)容的回調(diào):POST / HTTP/1.1 Host: live.example.com User-Agent: Go-http-client/1.1 { "domain": "aliyundoc.com", "app": "live", "stream": "teststream", "uri": "live/teststream/0_2017-03-08-23:09:46_2017-03-08-23:10:40.flv", "duration": 69.403, "start_time": 1488985786, "stop_time": 1488985840 }
注意事項(xiàng)
如果想知道自動(dòng)錄制(按域名/AppName/StreamName多級(jí)別自動(dòng)錄制、按定時(shí)任務(wù)自動(dòng)錄制)是否生效,可以設(shè)置錄制回調(diào),詳情請(qǐng)參見(jiàn)直播錄制回調(diào)。
如果希望針對(duì)每個(gè)錄制文件做實(shí)時(shí)處理,可通過(guò)創(chuàng)建錄制內(nèi)容索引文件實(shí)現(xiàn),詳情請(qǐng)參見(jiàn)錄制內(nèi)容合并與提取。
錄制周期為當(dāng)前直播轉(zhuǎn)為錄制文件后的最大時(shí)長(zhǎng),直播時(shí)長(zhǎng)超過(guò)設(shè)定的錄制周期后,將生成新文件,錄制周期支持15-360分鐘。可在直播控制臺(tái)上配置錄制模板時(shí)進(jìn)行設(shè)置,也可以調(diào)用接口AddLiveRecordVodConfig(錄制到VOD)或接口AddLiveAppRecordConfig(錄制到OSS)進(jìn)行設(shè)置。
如果在一個(gè)錄制周期內(nèi),直播流發(fā)生了斷流,但是在3分鐘內(nèi),該直播流又推上來(lái)了,那么仍會(huì)在同一個(gè)錄制文件中繼續(xù)錄制,不會(huì)生成新的錄制文件。這就意味著,一條直播流必須斷流超過(guò)3分鐘,才會(huì)生成最后一個(gè)錄制文件。
視頻直播支持觸發(fā)拉流,當(dāng)使用觸發(fā)拉流域名對(duì)應(yīng)的播放地址進(jìn)行播放時(shí),會(huì)自動(dòng)觸發(fā)阿里云視頻直播服務(wù)進(jìn)行拉流直播,無(wú)人播放時(shí)則不會(huì)回源站進(jìn)行拉流。自動(dòng)錄制、按需錄制、手動(dòng)錄制功能應(yīng)用在觸發(fā)拉流場(chǎng)景時(shí),如果觸發(fā)拉流無(wú)人播放,則不會(huì)回源站拉流,自動(dòng)錄制、按需錄制、手動(dòng)錄制同樣也不會(huì)進(jìn)行錄制。