64

互动直播的视频录制与合成—支持多人离线重入

 5 years ago
source link: https://segmentfault.com/a/1190000017917814?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

实现的效果图:

NfimY3Y.gif

上图合成了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,完成整个流程的,如下图所示:

eaEFrqn.png!web

接下来就正式进入服务器部署了,步骤如下:

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的方式就可以完成调用了。

开始录制,调用如下:

vAzmUba.png!web

结束录制,调用如下:

reamEzR.png!web

【使用小技巧】

声网的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元。

服务器成本而言,声网的服务器成本低于腾讯云的服务器成本。

看到这里相信开发者已经有了自己的选择,但不管怎么,希望本文能给大家一个解决视频录制和合成的思路,也希望大家在具体使用的时候能避开文章提到的一些坑。

最后

关注作者公众号,了解后续更多精彩内容:

jYjaMzQ.jpg!web

如果觉得本文对你有帮助,欢迎转发到朋友圈或直接分享给你的朋友。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK