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

实现的效果图:

image

上图合成了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文件产生之后再返回给调用端,保证程序的稳定性。

五、总结

上文分别介绍了两种视频录制合成的技术,下面我们对两种合成技术做一个对比,方便开发者选择更适合自己的技术方案。

对比一:功能对比

腾讯云的在线录制刚开始使用方便,但录制mp4格式视频会产生多个视频文件,所以后期的处理比较麻烦。而声网因为没有自己的在线录制功能,所以需要开发者自己配置录制服务器和保存视频,但录制视频完整(不会拆分为多个视频),支持多个视频的自动合成和离线重入。

对比二:服务器成本对比

1、腾讯云的收费分为三部分:第一部分,每路推流费用60元/路,按最高并发的路数计算,比如我们上个月的高峰期是一百个人同时在线,那推流的费用就按最高分并发的100*60=6000元;第二部分,云视频存储的费用,这部分空间的费用是很少的;第三部分,视频合成的服务器费用。

2、声网只需要录制服务器的费用,成本相对可控,,且费用不高,比如阿里云的云服务器,16核 + 32G内存 + 35兆固定宽带每月才3200元。

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

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

最后

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

image

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容