每每到618、雙11這樣的大型活動的時候,每天都有幾個重要的大v或者品牌直播需要保障。
以往的重點場次監播方式是這麼造的:
對每路直播的源流、各檔轉碼流分別起一個ffplay播放窗口,再手動調整尺寸在顯示器桌面進行佈局,排到一屏裏來監播。
這樣做的缺點:
-
操作複雜,手動調整畫面不美觀
-
不同的拉流時間點,起播時間有誤差,畫面無法協調一致
-
當拉多路流的時候,帶寬也受限制,基本上拉3-4個2m碼率以上的流本機就會卡頓了,此時如果流有問題,就不能準確判斷卡頓來源了,檢查起來也比較費勁
展示方式是這樣的:
ffplay 'rtmp://stream1' & ffplay 'rtmp://stream2' & ffplay 'rtmp://stream3' & ffplay 'rtmp:/stream4' & ffplay 'rtmp://stream5' & ffplay 'rtmp://stream6' & ffplay 'rtmp://stream7' & ffplay 'rtmp://stream8'
PS:這麼多的窗口,點着是挺麻煩的😓
在我們混流生產層能力完備後,就開始琢磨怎麼將它賦能在平常或者大促的直播間重保上,同時也爲了更加專業、更高效的進行監播,經過了一段時間的打磨,提煉了一個簡單的混流編排功能。
它的工作模式是這樣的:
在這裏你可以創建混流任務,並支持你在不斷流的狀態下做到更新任務輸入信息。
將要監播的直播流地址,需要展示的文字內容、佈局方式、混流輸出的模板配置進行下發,就可以拉到自動編排好的直播流地址。
它現在長這個樣子:
最終呈現出來的混流的效果是這樣的😁:
也可以是這樣的:
也可以呈現其他的佈局方式,目前還沒做的那麼豐富,不過底層能力和api接口是都支持的,完全靈活佈局。
在混流任務運行過程中,可以自由修改混流輸入源的配置。
這種新型的監播方式,可以直觀的區分源流、各檔轉碼流的播放效果:畫面內容是否正常,有無花屏、是否卡頓?
當出現問題時能夠指導我們快速做出決策:
-
轉碼流有問題,源沒有問題,快速排查任務日誌,定位是什麼原因導致
-
轉碼流有問題,源也有問題,迅速問題源流的流詳細信息,定位問題並通知業務方進行操作
-
主流都有問題,備流沒問題,通知業務方迅速切備流
還有其他的一些有點:
-
操作簡單方便,還可以記憶配置,下次直接修改
-
每個播放端只需拉一路流,節省本地帶寬
-
最多可以支持16路混流,一屏監播16路流的畫面
-
不斷流,輕鬆切換各種佈局
-
不斷流,隨便操作流的添加、刪除、修改
-
方便分享給其他人進行播放
混流佈局功能的底層實現框架:
- 定義通用的layout佈局結構-BasicClip
{
ClipType string `json:"clipType"`
LeftMargin int `json:"leftMargin"`
PosX *int `json:"posX"`
PosY *int `json:"posY"`
Width int `json:"width"`
Height int `json:"height"`
}
在此基礎上擴展出更豐富的BorderClip, TextClip, ImageClip等類型,來滿足不同的佈局元素設計。
- 定義通用的videoMask結構,它可以包含多個clip interface, 即各種clip元素,在videoMask中各個clip是同一個layer的,只允許在限定的尺寸中進行佈局。
type VideoMask struct {
Layer int `json:"layer"`
Clips []interface{} `json:"clips"`
}
- 每個輸入的視頻流,可以包含多個videoMask,多個videoMask在最終overlay的時候,按定義的layer先後順序進行鋪疊,以達到最終的預期視頻佈局效果。
應用場景拓展
- 什麼情況下使用混流?
◦當設備不支持同時拉多路流時使用混流,比如sip入會的場景。
◦需要多個視頻畫面、多個音頻流合成一個直播流時使用混流,比如會議錄製(rtc協議)場景、教育類場景(直播老師和學生的畫面)、直播連麥的場景等。
總結:此次能在618重保期間發揮它的價值,也算是有所得。希望以後可以在日常直播、展會等其他重要直播活動中發揮作用。關於混流的產品介紹以及更多的使用場景也會在後續的文章中一一展開,敬請期待。
作者:京東科技 孟曉偉
來源:京東雲開發者社區