实现的效果图: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/doc... 调用接口传参便可,若是是开启了自动录制功能,连调用web api都省了,可是灵活性相对低不少,而且这也是收费的,关于收费的细则详见下文,因此建议手动调用开启录制。服务器
本节重点来看ffmpeg合成视频的功能,如下是关于ffmpeg的介绍网络
下载地址:https://ffmpeg.zeranoe.com/bu...
中文翻译文档:https://www.bookstack.cn/read...
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/Ba...,部署到你的服务器;
二、下载录制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元。
服务器成本而言,声网的服务器成本低于腾讯云的服务器成本。
看到这里相信开发者已经有了本身的选择,但无论怎么,但愿本文能给你们一个解决视频录制和合成的思路,也但愿你们在具体使用的时候能避开文章提到的一些坑。
关注做者公众号,了解后续更多精彩内容:
若是以为本文对你有帮助,欢迎转发到朋友圈或直接分享给你的朋友。