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

实现的效果图:

上图合成了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元。

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

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

最后

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)

前言 以前制作一个Python窗体界面,我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的,今天朋友问我有没有Python窗体的设计工具,“用鼠标拖拖”就能完成窗体设计,我查了查相关资料,果然有一款好用的工具——Qt De…

JVM(三)对象的生死判定和算法详解

好的文章是能把各个知识点,通过逻辑关系串连起来,让人豁然开朗的同时又记忆深刻。 导读:对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一…

【STM32】修改芯片型号后报 Error 的解决方案

原文:https://blog.csdn.net/xiuhua_wu/article/details/85237418 背景 前几天有个新需求,使用 STM32 的标准库(STD)做个产品的例程。之前已经做了个 HAL 的,但人家客户不干,非要 STD 的。拖了一周&#xf…

Python手写神经网络实现3层感知机

一、BP神经网络结构模型 BP算法的基本思想是,学习过程由信号的正向传播和误差的反向传播俩个过程组成,输入从输入层输入,经隐层处理以后,传向输出层。如果输出层的实际输出和期望输出不符合,就进入误差的反向传…

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字,读完大约需要 6 分钟。 上一篇我们讲了垃圾标记的一些实现细节和经典算法,而本文将系统的讲解一下垃圾回收的经典算法,和Hotspot虚拟机执行垃圾回收的一些实现细节,比如安全点和安全区域等。 因为各个平台的虚拟…

python-cx_oracle报错“DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “

问题的主要原因是python-cx_oracle加载的是32位的instantclient-basic,我们需要让他读到64位的。 弄清版本,最重要!!! 首先安装配置时,必须把握一个点,就是版本一致!包括&#xff1…

JVM(五)垃圾回收器的前世今生

全文共 2195 个字,读完大约需要 8 分钟。 如果垃圾回收的算法属于内存回收的方法论的话,那本文讨论的垃圾回收器就属于内存回收的具体实现。 因为不同的厂商(IBM、Oracle),实现的垃圾回收器各不相同,而本文…

【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测

目录 一,准备 1.1代码1.2 环境准备1.3 搭建镜像1.4 配置slowfast环境1.5 ava.json1.6 SLOWFAST_32x2_R101_50_50.yaml1.7 SLOWFAST_32x2_R101_50_50 .pkl二,代码运行三 错误解决复现过程视频:B站复现视频复现结果 一,准备 1.1代…

MySQL学生向笔记以及使用过程问题记录(内含8.0.34安装教程

MySQL 只会写代码 基本码农 要学好数据库,操作系统,数据结构与算法 不错的程序员 离散数学、数字电路、体系结构、编译原理。实战经验, 高级程序员 去IOE:去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源…

程序员专属精品简历合集—面试必备

听说你最近打算换工作?听说你和好工作之间,只差一个漂亮的简历模板?人们常说“金三银四”,一年之际在于春。不管你是主动离职,还是被动“被离职”(稳住,我们能赢!)&#…

ubuntu20.10下wine安装微信

1.unbuntu20.04下安装wine sudo apt-get install wine2.微信官网http://short.weixin.qq.com/下载window系统微信软件 3.在wine中安装微信 在WeChatSetup.exe文件中打开终端输入: wine WeChatSetup.exe

【faster rcnn 实现via的自动框人】使用detectron2中faster rcnn 算法生成人的坐标,将坐标导入via(VGG Image Annotator)中,实现自动框选出人的区域

前言 B站讲解视频 我的研究生毕业论文方向就是时空行为检测,所以,slowfast和ava是我重点搞的,我的博客主页也有很多这些相关内容。 终于,到了标注数据这一块了,为了更简单的标注数据,我要做的这部分的数据…

程序员精美简历Top榜—面试必备

听说你最近打算换工作?听说你和好工作之间,只差一个漂亮的简历模板? 不管是主动离职,还是“被离职”(稳住,我们能赢!),趁着大好时光和对新年的憧憬,再找一个…

失败创业者的告白:初创团队应有一位绝对领导者

做了两年的项目失败了,我们的项目做的是数码3C的优惠信息,我是一个80后,小硕一枚;我们的1号创始人是90后,有激情、有梦想;在十八岁那年带上他的梦想千里北上,找我们的开复老师指点一二;但那时,开复老师正为…

【ffmpeg裁剪视频faster rcnn自动检测 via】全自动实现ffmpeg将视频切割为图片帧,再使用faster rcnn将图片中的人检测出来,最后将检测结果转化为via可识别的csv格式

目录 前言一,ffmpeg 自动裁剪 1.1 目录结构1.2 cutVideoToImage.sh1.2 myVideo1.3 myVideo15mins1.5 myFrames1.6 运行1.7 查看结果二,detectron2中的faster rcnn检测 2.1 img2.2 myvia.py2.3 运行2.4 结果展示三,via标注 3.1 csv文件修改&am…

ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译

1.安装wine 在终端中输入: sudo apt-get install wine2.安装pip 在https://pypi.org/project/pip/#files下载pip-21.0.tar.gz,在压缩包上右键提取到此处,打开解压的文件夹pip-21.0 在该文件夹中打开终端安装pip-21.0.tar.gz: wi…

JVM(六)为什么新生代有两个Survivor分区?

本文会使用排除法的手段,来讲解新生代的区域划分,从而让读者能够更清晰的理解分代回收器的原理,在开始之前我们先来整体认识一下分代收集器。 分代收集器会把内存空间分为:老生代和新生代两个区域,而新生代又会分为&a…

【slowfast复现 训练】训练过程 制作ava数据集 复现 SlowFast Networks for Video Recognition 训练 train

目录 前言一,ava相关文件准备 1.1 空间准备(500G)1.2 整体ava文件结构1.3 frames文件1.4 frame_lists 文件1.5 annotations 文件二,预训练模型三,配置文件 3.1 创建新的yaml文件3.2 yaml文件解释四,训练前言…

Qt6 在线安装图文步骤

说明: Qt 自从5.15版本开始,对非商业版本,也就是开源版本,不提供已经制作好的离线exe安装包,自这个版本开始你只有两种选择: 1、编译源码 例如qt-everywhere-src-5.15.2.zip 编译步骤繁琐,需严…

【slowfast 减少ava数据集】将ava数据集缩小到2个,对数据集做训练,然后进行检测,为训练自己的数据集做准备

目录 前言一,数据文件结构 1.1 myava1.2 annotations1.3 annotations文件处理1.4 frame_lists1.5 frames二,预训练模型四,配置文件 4.1 创建新的yaml文件4.2 yaml文件解释五,训练六,结果查看前言 b站讲解 ava的数据集…