互動直播的視頻錄製與合成—支持多人離線重入

實現的效果圖:

上圖合成了2個人視頻,中途有1個人先離開之後又重新加入了房間。

一、業務場景

業務場景是這樣的:多個用戶(2-4人)直播的視頻,合成爲一個視頻,這期間要滿足2個條件:首先,錄製途中可能有一個或多個用戶不定次數的離線、重進(網絡差和人爲操作)的情況;第二,要保證合成的視頻和錄製的效果是一樣的必須是同步的(不能出現多個視頻時間對不上的情況)。

基於以上兩個條件來說,程序的實現難度還是有的,不過還好,筆者已經找到了一些解決方案,下面來和大家分享一下。

二、解決方案概述

方案一:使用騰訊雲互動直播和在線錄製,不過騰訊雲錄製的視頻mp4格式,每30分鐘分爲一個文件,也就是說錄製途中可能出現多個視頻,而且錄製之後轉碼的時間不確定,所以錄製之後,要藉助數據庫的記錄信息和ffmpeg做多個視頻的合成。

方案二:使用聲網的互動直播和服務器錄製,缺點是聲網並不提供在線錄製功能,需要用戶自己部署錄製服務器,優點是聲網錄製的視頻是完整的,並在錄製結束之後可以立馬查看視頻。

以上兩種方案,都支持一定時間內(5分鐘也可以自己設定),一個或多個人離開房間之後有重新進入房間的情況,並且不會影響視頻的錄製,而且視頻也是同步的,不能出現多個視頻時間對不上的情況。

三、騰訊雲錄製方案

本文主要講的是視頻錄製與合成,所以關於互動直播的內容,並不屬於本文討論的範圍,有對互動直播感興趣的同學可以點擊鏈接查看,騰訊實時音視頻參考地址:http://t.cn/EquSeRo

騰訊雲的在線錄製還是比較簡單的,可以使用Web API的方式實現,參考文檔:https://cloud.tencent.com/doc... 調用接口傳參即可,如果是開啓了自動錄製功能,連調用web api都省了,但是靈活性相對低很多,並且這也是收費的,關於收費的細則詳見下文,所以建議手動調用開啓錄製。

本節重點來看ffmpeg合成視頻的功能,以下是關於ffmpeg的介紹

官網:http://ffmpeg.org/

下載地址:https://ffmpeg.zeranoe.com/bu...

中文翻譯文檔:https://www.bookstack.cn/read...

ffmpeg的使用還是很簡單的,通過上面連接只需要把ffmpeg下載好就可以了,然後通過調用命令就可以合成視頻了。因爲我們是mp4格式的視頻(至於爲什麼是mp4的,因爲業務的需求,還要和其他功能銜接,所以必須是mp4格式的),所有就不能直接使用ffmpeg的命令,一次性的合成多個mp4文件了,但是可以通過把mp4文件轉換成ts格式文件,再一次性的合成多個視頻並轉換視頻爲mp4的。

具體步驟如下:

1、 打開命令行,切換到ffmpeg的安裝目錄

2、 使用命令,把多個mp4文件分別轉換成ts格式文件ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts

3、 使用命令,把轉換好的多個ts文件進行拼加,並轉換視頻格式爲mp4ffmpeg -i "concat:1.ts|2.ts|3.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

這樣就完成了視頻的合成。當然在合成視頻之前先要把騰訊雲的視頻下載下來,合成視頻之後可以選擇把視頻再上傳到騰訊雲的雲端。

四、聲網錄製方案

和騰訊雲相同,聲網的互動直播集成文檔:http://t.cn/Eq3RpOS 本節重點介紹視頻錄製合成功能。

聲網的錄製服務器要自己配置,首先需要買一個Linux服務器,目前只支持Linux哦,然後設置服務器,如下所述。

服務器配置

1、 Ubuntu 12.04+ x64 或 CentOS 6.5+ x64

2、 GCC 4.4+ (一般linux系統都會預裝,使用命令:gcc -v查看版本號)

3、 公網IP

4、 域名“qos.agoralab.co”加入白名單

5、 NodeJS 8.9+

服務器的錄製程序可以使用NodeJS來實現,這對於開發者來說也是一件好事,畢竟減低了程序部署的門檻,它實現的原理是使用:NodeJS的Express框架來實現Restful API的調用,NodeJS在調用C++的插件,通過插件再調用C++的錄製SDK,完成整個流程的,如下圖所示:

調用原理圖

接下來就正式進入服務器部署了,步驟如下:

1、下載NodeJs部署程序,訪問:https://github.com/AgoraIO/Ba...,部署到你的服務器;

2、下載錄製SDK,訪問:http://t.cn/Eq17cLU

3、解壓錄製SDK並拷貝到NodeJS部署目錄的 record/src/sdk 目錄;

4、安裝node-gyp,使用命令: npm install -g node-gyp

5、打開終端,進入 Agora-Restful-Recording-Nodejs/record 目錄,運行sh文件 sh build.sh ,編譯C++的調用,運行成功之後可以看到“agorasdk.node”文件;

以上操作,也可查看官網文檔(英文的):http://t.cn/Eq1ZncK

完成以上操作之後,真正的坑纔在等着你,下面來說重點了。

【程序部署的坑】

執行完以上操作之後,需要下面的兩項設置,才能正常的錄製視頻:

1、設置Linux文件夾權限: chmod -R 777 /{你的目錄}/Agora-Restful-Recording-Nodejs

2、設置你的互動直播客戶端爲直播模式,因爲NodeJS裏面是寫死的直播模式,而客戶端的互動直播默認的是非直播模式,所以需要設置:setChannelProfile(1)和setClientRole(1),否則錄製的視頻是純色的背景圖,無內容;

恭喜你經過以上的配置,終於可以運行視頻錄製了,到在開始之前你需要先運行NodeJS的Express項目:

1、使用終端,切換到Agora-Restful-Recording-Nodejs/server目錄,執行 npm install 安裝;

2、使用終端 node app.js 運行項目;

這個時候使用Web API的方式就可以完成調用了。

開始錄製 ,調用如下:

開始錄製

結束錄製 ,調用如下:

結束錄製

【使用小技巧】

聲網的appid參數配置在程序中,不要通過參數傳遞,降低賬號被盜用的風險

有了以上的步驟就完成了程序的錄製,不過還有更多的坑在後面等着你,筆者整理了使用中的坑,如下。

【使用中的坑】

1、錄製的視頻不能直接返回mp4地址,需要遍歷文件夾路徑找到mp4格式文件返回。

2、設置允許離線時長,此項目默認只有10秒,時間太短了,最好要設置5分鐘,通過設置Agora-Restful-Recording-Nodejs/record/src/agora_node_ext/agora_node_recording.cpp文件中的config.idleLimitSec=300修改運行離線時長爲5分鐘。

3、mp4文件有時不會立馬產生,會出現偶爾遍歷文件夾,mp4文件還沒產生的情況,這個時候直接返回給調用端會導致程序缺陷,所有要創建一個循環檢測計數器,檢測mp4文件產生之後再返回給調用端,保證程序的穩定性。

五、總結

上文分別介紹了兩種視頻錄製合成的技術,下面我們對兩種合成技術做一個對比,方便開發者選擇更適合自己的技術方案。

對比一:功能對比

騰訊雲的在線錄製剛開始使用方便,但錄製mp4格式視頻會產生多個視頻文件,所以後期的處理比較麻煩。而聲網因爲沒有自己的在線錄製功能,所以需要開發者自己配置錄製服務器和保存視頻,但錄製視頻完整(不會拆分爲多個視頻),支持多個視頻的自動合成和離線重入。

對比二:服務器成本對比

1、騰訊雲的收費分爲三部分:第一部分,每路推流費用60元/路,按最高併發的路數計算,比如我們上個月的高峯期是一百個人同時在線,那推流的費用就按最高分併發的100*60=6000元;第二部分,雲視頻存儲的費用,這部分空間的費用是很少的;第三部分,視頻合成的服務器費用。

2、聲網只需要錄製服務器的費用,成本相對可控,,且費用不高,比如阿里雲的雲服務器,16核 + 32G內存 + 35兆固定寬帶每月才3200元。

服務器成本而言,聲網的服務器成本低於騰訊雲的服務器成本。

看到這裏相信開發者已經有了自己的選擇,但不管怎麼,希望本文能給大家一個解決視頻錄製和合成的思路,也希望大家在具體使用的時候能避開文章提到的一些坑。

最後

關注作者公衆號,瞭解後續更多精彩內容:

如果覺得本文對你有幫助,歡迎轉發到朋友圈或直接分享給你的朋友。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章