我们为很多实时互动场景提供了服务。在一些场景中,用户不仅需要实时互动,还需要把互动的过程录下来。那么一个好的录制解决方案究竟需要具备哪些特征呢?

在回答这个问题之前,先聊一下客户使用录制的原因。一般来讲,用户使用录制功能的原因主要有三种:

1. 质检。比如在教育场景下,需要通过回放录制来检查课程质量,在社交直播或金融双录场景下,需要保留录制视频,做合规性审查。

2. 留证。如教育、医疗、音视频客服等场景,需存档留证以应对可能的纠纷。这种场景下,对录制方案的核心诉求是内容完整性,不能容忍哪怕是秒级的视频丢录。

3. 回放。比如在教育场景、直播场景下,用户希望观看回放。这也是大多数实时互动场景里使用录制的主要原因。

那么在这种场景下,怎样才算是一个好的录制解决方案呢?

可以从五个维度来衡量录制方案:

  • 录制效果:需要还原真实的互动场景,包括音视频、课件、白板、聊天信息等所有元素。同时,不能对主播音视频互动体验造成任何负面影响。

  • 集成难度:越简单越好,最好是不需要开发。

  • 等待时长:等待时长越短越好,最好是录制结束后可以立即回放。

  • 文件兼容性:任何平台、任意浏览器都可以播放。

  • 文件迁移的便利性:文件下载、上传等迁移过程要非常简单,便于录制文件管理。

为了解决各种场景的录制需求,目前有两种比较主流的方案。

一、音视频、白板等元素分别录制,然后拼接回放

主要思路是将音视频、白板、课件、PPT、聊天内容等分别录制下来,录制结束后再分别回放,并通过时间戳对齐播放进度。这种方案的好处是,白板、课件、聊天内容等均以数据形式回放,可以保留原有的真实互动效果,例如 PPT 可以单独翻页,灵活性较好。但其缺点也非常明显:

1. 集成难度大。需要同时开发音视频录制、白板录制、聊天内容的录制,特别是各不同元素需要通过时间戳对齐回放,要做到非常好的同步效果需投入较多开发精力。

2. 播放兼容性受限。这种方式只能通过特殊播放器来回放,无法很好地兼容主流播放器。

3. 等待时间长。为了解决播放兼容性问题,往往需要在录制结束后进行离线处理,转成一个完整的 MP4 文件,这个过程等待时间较长,还会带来额外的转码成本。

二、本地客户端录屏

不管是本地客户端录制,还是通过屏幕共享将屏幕流发送到云端进行录制,其本质都是在用户的本地客户端上捕获屏幕内容。这种方案的好处是所见即所得,回放效果跟真实互动场景可以保持一致。但其缺点也是相当明显:

1. 影响本地用户的 RTC 互动体验。本地捕获屏幕内容会极大地消耗终端设备的计算资源,如果要实时上传,还会占用主播上行的带宽资源,这些都会影响本地用户的音视频通话体验甚至会出现卡顿、模糊等严重的后果,这对一个实时互动场景来说是难以接受的致命缺陷。

2. 集成难度大。开发者需要在端上进行开发,需要解决文件本地存储、上传等问题,往往还需要处理复杂的混音问题,集成门槛非常高。

除了以上两种主流思路,是否还有其他更好的方案呢?

声网Agora提出了第三种新思路:页面录制

页面录制是指通过 Web 页面渲染的方式, 在服务端同步录制音视频、白板、课件以及聊天信息等,还原真实的互动场景。其原理是:开发者通过 RESTful API 发起录制请求,并将待录制页面的 URL 以请求参数的形式发给 Agora 录制服务,Agora 录制服务会打开该Web页面,并以录屏的方式实时录制生成 MP4 文件,上传至指定的第三方云存储平台。具体 页面录制 文档,可点击「阅读原文」浏览。

根据此前录制方案判断维度,将页面录制与此前我们列举的录制方案相比:

  • 在集成上,通过Restful API发起请求录制,简单易用。

  • 录制效果实现所见即所得的,将音视频、白板、课件以及聊天信息等内容全部同时录制下来,且不带来额外的带宽、性能开销,录制过程不影响任何主播/观众的RTC互动体验。

  • 录制结束后,可以实时生成MP4文件,兼容各主流播放器。

  • 文件下载非常简单,便于录制文件管理。

同时,页面录制具备录制任意网页页面的能力,所以用 WebRTC 或其它方案自研 RTC 功能的开发者同样可以使用。

页面录制服务上线:RESTful API 调用实现,所见所录即所得的更多相关文章

  1. 初见微服务之RESTful API

    1. REST名称由来 REST全称为Representational State Transfer,即表述性状态转移,最早由Roy Feilding博士在世纪之交(2000年)提出,喜欢追根溯源的朋 ...

  2. Restful Api调用工具类

    RestfulHttpClient.java package pres.lnk.utils; import com.fasterxml.jackson.databind.ObjectMapper; i ...

  3. 人人都是 API 设计师:我对 RESTful API、GraphQL、RPC API 的思考

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 有一段时间没怎么写文章了,今天提笔写一 ...

  4. Restful API 指南

    作为软件开发人员,我们大多数人在日常生活中使用或构建 REST api.API 是系统之间的默认通信方式.亚马逊是如何有效地使用 api 进行通信的最佳例子. 在这篇文章中,我将讨论如何更好地设计 R ...

  5. 探讨Morest在RESTful API测试的行业实践

    摘要:在本文中,我们将重点探讨使用自动化智能化Morest测试技术在RESTful API测试的行业实践. 本文分享自华为云社区<[智能化测试专题]华为云API智能测试工具--Morest测试框 ...

  6. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...

  7. Web服务器Raspkate的RESTful API

    基于轻量型Web服务器Raspkate的RESTful API的实现 在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RE ...

  8. 如何用Baas快速在腾讯云上开发小程序-系列3 :实现腾讯云COS API调用

    版权声明:本文由贺嘉 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/640268001487425627 来源:腾云阁 h ...

  9. Restful api 防止重复提交

    当前很多网站是前后分离的,前端(android,iso,h5)通过restful API 调用 后端服务器,这就存在一个问题,对于创建操作,比如购买某个商品,如果由于某种原因,手抖,控件bug,网络错 ...

  10. 测试RESTful API利器-Postman

    对于前端开发者而言,最需要的往往不是技术本身,其实技术都没什么难的,而最缺少的则是各种各样好的兵器,比如调试,开发工具等等. 我们这里就推荐一款前端开发的利器-Postman,它是Google Chr ...

随机推荐

  1. 我的第三次JAVA作业

    ------------恢复内容开始------------ 1.对象与对象引用的区别是什么? 请举例说明 创建对象被分配在堆中,对象引用分配在栈中. eg. new FighterPlane(); ...

  2. Python数据挖掘——银行分控模型的建立

    数据初始化 import pandas as pd from keras.models import Sequential from keras.layers.core import Dense, A ...

  3. LeetCode系列之 (JavaScript) => 53. 最大子数组和

    题目描述: leetcode 题目链接: 53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com) 解题思路分析: 题干最终的输出是连续子数组的最大和:1. 贪心算法: ...

  4. JDBC——连接SQL Server环境配置

    JDBC:使用JAVA语言操作关系型数据库的API.是一套标准的接口. 步骤 1.创建工程,导入驱动jar包 2.注册驱动:Class.forName("com.mysql.jdbc.Dri ...

  5. 修改浏览器搜索引擎:设置网址格式(用“%s”代替搜索字词)

    浏览器搜索引擎设置,如何填写网址格式(用"%s"代替搜索字词)? 以下收集部分: 综合检索 名称 关键字 网址(用"%s"代替搜索字词) 必应 cn.bing. ...

  6. 1、HTTP的基本概念与交互模型

    1.上网的整个过程 假设我们点击了某网页上的一个链接,指向清华大学院系设置,其URL是:http://www.tsinghua.edu.cn/chn/yxsz/index.html.我们来分析一下整个 ...

  7. 08 分布式计算MapReduce--词频统计

    def getText(): txt=open("D:\\test.txt","r").read() txt=txt.lower() punctuation = ...

  8. Ubuntu系统设置普通用户最大文件打开数

    背景: Elasticsearch启动报错: ERROR:  bootstrap checks failedmax file descriptors [4096] for elasticsearch ...

  9. ES2015常用知识点

    ES2015(又称ES6)部分1 let/const以及块作用域:2 循环语句 const arr=[1,2,3]; for(const item of arr){ console.log(item) ...

  10. vue项目启动报错问题解决. Module build failed: Error: Node Sass does not yet support your current environment

    导入vue项目后,启动报错,异常如下: 1 error in ./src/pages/home.vue 2 Module build failed: Error: Node Sass does not ...