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


實現效果圖:

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

一、業務場景

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

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

二、解決方案概述

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

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

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

三、騰訊雲錄制方案

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

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

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

官網:http://ffmpeg.org/

下載地址: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的。

具體步驟如下:

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/Basic-Recording 下載zip,部署到你的服務器;

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文件產生之后再返回給調用端,保證程序的穩定性。

4、視頻合成的畫面是可以自己布局的,除了可以自定義合成視頻的位置之外,還可以自定義視頻大小,但在改變視頻大小的時候,必須是以下枚舉值的其中之一,如下圖:

分辨率枚舉值

五、總結

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

對比一:功能對比

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

對比二:服務器成本對比

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

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

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

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

最后

關注作者公眾號,了解后續更多精彩內容:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM