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

實現效果圖:node

上圖合成了2我的視頻,中途有1我的先離開以後又從新加入了房間。linux

1、業務場景

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

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

2、解決方案概述

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

方案二:使用聲網的互動直播和服務器錄製,缺點是聲網並不提供在線錄製功能,須要用戶本身部署錄製服務器,優勢是聲網錄製的視頻是完整的,並在錄製結束以後能夠立馬查看視頻。數據庫

以上兩種方案,都支持必定時間內(5分鐘也能夠本身設定),一個或多我的離開房間以後有從新進入房間的狀況,而且不會影響視頻的錄製,並且視頻也是同步的,不能出現多個視頻時間對不上的狀況。npm

3、騰訊雲錄製方案

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

騰訊雲的在線錄製仍是比較簡單的,可使用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的。

具體步驟以下:

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

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

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

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

4、聲網錄製方案

和騰訊雲相同,聲網的互動直播集成文檔: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文件產生以後再返回給調用端,保證程序的穩定性。

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

分辨率枚舉值

5、總結

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

對比一:功能對比

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

對比二:服務器成本對比

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

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

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

看到這裏相信開發者已經有了本身的選擇,但無論怎麼,但願本文能給你們一個解決視頻錄製和合成的思路,也但願你們在具體使用的時候能避開文章提到的一些坑。

最後

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

若是以爲本文對你有幫助,歡迎轉發到朋友圈或直接分享給你的朋友。

相關文章
相關標籤/搜索