實現效果圖:node
上圖合成了2我的視頻,中途有1我的先離開以後又從新加入了房間。linux
業務場景是這樣的:多個用戶(2-4人)直播的視頻,合成爲一個視頻,這期間要知足2個條件:首先,錄製途中可能有一個或多個用戶不定次數的離線、重進(網絡差和人爲操做)的狀況;第二,要保證合成的視頻和錄製的效果是同樣的必須是同步的(不能出現多個視頻時間對不上的狀況)。git
基於以上兩個條件來講,程序的實現難度仍是有的,不過還好,筆者已經找到了一些解決方案,下面來和你們分享一下。github
方案一:使用騰訊雲互動直播和在線錄製,不過騰訊雲錄製的視頻mp4格式,每30分鐘分爲一個文件,也就是說錄製途中可能出現多個視頻,並且錄製以後轉碼的時間不肯定,因此錄製以後,要藉助數據庫的記錄信息和ffmpeg作多個視頻的合成。web
方案二:使用聲網的互動直播和服務器錄製,缺點是聲網並不提供在線錄製功能,須要用戶本身部署錄製服務器,優勢是聲網錄製的視頻是完整的,並在錄製結束以後能夠立馬查看視頻。數據庫
以上兩種方案,都支持必定時間內(5分鐘也能夠本身設定),一個或多我的離開房間以後有從新進入房間的狀況,而且不會影響視頻的錄製,並且視頻也是同步的,不能出現多個視頻時間對不上的狀況。npm
本文主要講的是視頻錄製與合成,因此關於互動直播的內容,並不屬於本文討論的範圍,有對互動直播感興趣的同窗能夠點擊連接查看,騰訊實時音視頻參考地址:http://t.cn/EquSeRoapi
騰訊雲的在線錄製仍是比較簡單的,可使用Web API的方式實現,參考文檔:https://cloud.tencent.com/document/product/267/9567 調用接口傳參便可,若是是開啓了自動錄製功能,連調用web api都省了,可是靈活性相對低不少,而且這也是收費的,關於收費的細則詳見下文,因此建議手動調用開啓錄製。服務器
本節重點來看ffmpeg合成視頻的功能,如下是關於ffmpeg的介紹網絡
下載地址:https://ffmpeg.zeranoe.com/builds/
中文翻譯文檔:https://www.bookstack.cn/read/other-doc-cn-ffmpeg/README.md
ffmpeg的使用仍是很簡單的,經過上面鏈接只須要把ffmpeg下載好就能夠了,而後經過調用命令就能夠合成視頻了。由於咱們是mp4格式的視頻(至於爲何是mp4的,由於業務的需求,還要和其餘功能銜接,因此必須是mp4格式的),全部就不能直接使用ffmpeg的命令,一次性的合成多個mp4文件了,可是能夠經過把mp4文件轉換成ts格式文件,再一次性的合成多個視頻並轉換視頻爲mp4的。
具體步驟以下:
一、 打開命令行,切換到ffmpeg的安裝目錄;
二、 使用命令,把多個mp4文件分別轉換成ts格式文件 : ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
;
三、 使用命令,把轉換好的多個ts文件進行拼加,並轉換視頻格式爲mp4 :ffmpeg -i "concat:1.ts|2.ts|3.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
;
這樣就完成了視頻的合成。固然在合成視頻以前先要把騰訊雲的視頻下載下來,合成視頻以後能夠選擇把視頻再上傳到騰訊雲的雲端。
和騰訊雲相同,聲網的互動直播集成文檔:http://t.cn/Eq3RpOS 本節重點介紹視頻錄製合成功能。
聲網的錄製服務器要本身配置,首先須要買一個Linux服務器,目前只支持Linux哦,而後設置服務器,以下所述。
服務器配置
一、 Ubuntu 12.04+ x64 或 CentOS 6.5+ x64
二、 GCC 4.4+ (通常linux系統都會預裝,使用命令:gcc -v查看版本號)
三、 公網IP
四、 域名「qos.agoralab.co」加入白名單
五、 NodeJS 8.9+
服務器的錄製程序可使用NodeJS來實現,這對於開發者來講也是一件好事,畢竟減低了程序部署的門檻,它實現的原理是使用:NodeJS的Express框架來實現Restful API的調用,NodeJS在調用C++的插件,經過插件再調用C++的錄製SDK,完成整個流程的,以下圖所示:
接下來就正式進入服務器部署了,步驟以下:
一、下載NodeJs部署程序,訪問:https://github.com/AgoraIO/Basic-Recording 下載zip,部署到你的服務器;
二、下載錄製SDK,訪問:http://t.cn/Eq17cLU;
三、解壓錄製SDK並拷貝到NodeJS部署目錄的 record/src/sdk
目錄;
四、安裝node-gyp,使用命令: npm install -g node-gyp
;
五、打開終端,進入 Agora-Restful-Recording-Nodejs/record
目錄,運行sh文件 sh build.sh
,編譯C++的調用,運行成功以後能夠看到「agorasdk.node」文件;
以上操做,也可查看官網文檔(英文的):http://t.cn/Eq1ZncK
完成以上操做以後,真正的坑纔在等着你,下面來講重點了。
【程序部署的坑】
執行完以上操做以後,須要下面的兩項設置,才能正常的錄製視頻:
一、設置Linux文件夾權限: chmod -R 777 /{你的目錄}/Agora-Restful-Recording-Nodejs
;
二、設置你的互動直播客戶端爲直播模式,由於NodeJS裏面是寫死的直播模式,而客戶端的互動直播默認的是非直播模式,因此須要設置:setChannelProfile(1)和setClientRole(1),不然錄製的視頻是純色的背景圖,無內容;
恭喜你通過以上的配置,終於能夠運行視頻錄製了,到在開始以前你須要先運行NodeJS的Express項目:
一、使用終端,切換到Agora-Restful-Recording-Nodejs/server目錄,執行 npm install
安裝;
二、使用終端 node app.js
運行項目;
這個時候使用Web API的方式就能夠完成調用了。
開始錄製 ,調用以下:
結束錄製 ,調用以下:
【使用小技巧】
聲網的appid參數配置在程序中,不要經過參數傳遞,下降帳號被盜用的風險
有了以上的步驟就完成了程序的錄製,不過還有更多的坑在後面等着你,筆者整理了使用中的坑,以下。
【使用中的坑】
一、錄製的視頻不能直接返回mp4地址,須要遍歷文件夾路徑找到mp4格式文件返回。
二、設置容許離線時長,此項目默認只有10秒,時間過短了,最好要設置5分鐘,經過設置Agora-Restful-Recording-Nodejs/record/src/agora_node_ext/agora_node_recording.cpp文件中的config.idleLimitSec=300修改運行離線時長爲5分鐘。
三、mp4文件有時不會立馬產生,會出現偶爾遍歷文件夾,mp4文件還沒產生的狀況,這個時候直接返回給調用端會致使程序缺陷,全部要建立一個循環檢測計數器,檢測mp4文件產生以後再返回給調用端,保證程序的穩定性。
四、視頻合成的畫面是能夠本身佈局的,除了能夠自定義合成視頻的位置以外,還能夠自定義視頻大小,但在改變視頻大小的時候,必須是如下枚舉值的其中之一,以下圖:
上文分別介紹了兩種視頻錄製合成的技術,下面咱們對兩種合成技術作一個對比,方便開發者選擇更適合本身的技術方案。
對比一:功能對比
騰訊雲的在線錄製剛開始使用方便,但錄製mp4格式視頻會產生多個視頻文件,因此後期的處理比較麻煩。而聲網由於沒有本身的在線錄製功能,因此須要開發者本身配置錄製服務器和保存視頻,但錄製視頻完整(不會拆分爲多個視頻),支持多個視頻的自動合成和離線重入。
對比二:服務器成本對比
一、騰訊雲的收費分爲三部分:第一部分,每路推流費用60元/路,按最高併發的路數計算,好比咱們上個月的高峯期是一百我的同時在線,那推流的費用就按最高分併發的100*60=6000元;第二部分,雲視頻存儲的費用,這部分空間的費用是不多的;第三部分,視頻合成的服務器費用。
二、聲網只須要錄製服務器的費用,成本相對可控,,且費用不高,好比阿里雲的雲服務器,16核 + 32G內存 + 35兆固定寬帶每個月才3200元。
服務器成本而言,聲網的服務器成本低於騰訊雲的服務器成本。
看到這裏相信開發者已經有了本身的選擇,但無論怎麼,但願本文能給你們一個解決視頻錄製和合成的思路,也但願你們在具體使用的時候能避開文章提到的一些坑。
關注做者公衆號,瞭解後續更多精彩內容:
若是以爲本文對你有幫助,歡迎轉發到朋友圈或直接分享給你的朋友。