本地服务端录制
背景
作为一名最近加入 Agora 的技术人员,看到大家在使用该产品的过程中会遇到各种各样的问题,决定写一篇本地服务端录制相关的文章,方便后续有用到该产品的开发者能够更快的,更丝滑的跑起来;
当然了如果想省事省力,最推荐你们去使用Agora 的 云录制服务,通过四个 (start, stop,update, acquire) Restful 请求就可以实现录制功能了;
废话不多说,我们开始吧!
跑通SDK
开通服务
如果没有声网账户,需要去控制台注册一个 ,然后新建项目,拿到一个 AppID 和 临时Token , 用于后续调用 API 对用户进行鉴权; 参考官方文章
搭建环境
-
前提条件
一台有公网IP 的 Linux 服务器
-
下载SDK
本文以Java SDK V3.0.7 举例,下载地址为 资源获取
下载完成后,软件包结构如下:
-
搭建开发环境(重要) 参考官方文档
-
安装编译器: gcc 4.4+
-
配置好 jdk 环境,并确保包含 jni.h。
eg:export JAVA_HOME=/usr/lib/java/jdk1.8.0_381 //这里是你获取的jdk绝对路径 export JRE_HOME=$JAVA_HOME/jre //配置jre路径
-
配置好 Java 的 CLASSPATH 和 Linux 的 LD_LIBRARY_PATH 环境变量。
eg:vim /etc/profile export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar //classpath是javac编译器专用的一个环境变量,作用是告诉Java执行环境, //在哪些目录下可以找到您所要执行的Java程序所需要的类或者包。 export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin //定义环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/Agora_Recording_SDK_for_Linux_FULL/samples/java/bin/io/agora/recording/ source /etc/profile
-
如果你的网络环境设置了防火墙限制外网访问,请使用云代理服务。
-
打开所有的录制进程所使用的 UDP 端口,端口为在 RecordingConfig 中指定的 lowUdpPort 和 highUdpPort 范围之间的端口。
-
-
运行测试
-
打开命令行工具,在 samples/java 路径下执行如下命令进行环境预设置。其中 jni_path 请填入 jni.h 文件绝对路径,例如 /usr/java8u161/jdk1.8.0_161/include/:
source build.sh pre_set jni_path
-
在 samples/java 下执行编译脚本:编译完成,在本目录下生成一个 bin 文件夹,其中的子目录 io/agora/recording 下会包含一个 librecording.so 文件,如图所示。
./build.sh build
-
录制启动
打开命令行工具,在 /samples/java/bin 目录下执行 java RecordingSample 加上必要的参数设置, 即可快速开始录制,例如:
java RecordingSample --appId appID --channel channelName --uid 0 --channelProfile 1 --appliteDir Agora_Recording_SDK_for_Linux_FULL/bin
运行成功,控制台会有打印 RecordingSDK joinChannel success, channelId:XXX, uid:XXX 等信息
录制结束
- 在默认情况下,当频道空闲(无用户)超过 300 秒(在 RecordingConfig 中的 idleLimitSec 可以设置该时间)后,录制实例会自动退出频道停止录制;
- 录制完成后,调用 leaveChannel 方法离开频道,停止录制。录制结束后如果需要再次开始录制,必须重新创建并加入频道
编译运行SDK失败问题汇总
本地录制相关参数查看:
onLeaveCode: Agora On-Premise Recording SDK Java API Reference - 本地服务端录制 - 文档中心 - 声网Agora
onError Native Error code: Java API Reference for Android - 互动直播 (Legacy) - 文档中心 - 声网Agora (shengwang.cn)
-
问题一: /usr/bin/ld: cannot find -lstdc++
centos 8 以前解决方案:
yum install glibc-static
yum install libstdc+±static
centos 8 解决方案:
dnf --enablerepo=powertools install libstdc±static
-
问题二: 集成时报错 java.land.UnsatisfiedLinkError: no recording in java.library.path
参考官方文档 正确配置LD_LIBRARY_PATH:如何处理录制 SDK 集成问题 -
问题三:录制指令报错 RecordingSDK onError,error:2,stat code:3
jni layer stopped!AgoraJniProxySdk destructor begin
AgoraJniProxySdk destructor end
jni layer has been exited…原因: error 2: API 调用了无效的参数。例如指定的频道名含有非法字符,或者 参数–appliteDir设置有误,该参数值为录制进程AgoraCoreService所在的目录,找不到录制子进程,可以打开对应时间的文件夹中的 recordingsys.log 确认具体原因
-
问题四 录制指令报错 Error: 13,with stat_code:3
日志错误提示:Failed to call execvp(…/…/bin/AgoraCoreService): Permission denied原因:录制子进程AgoraCoreService没有执行权限,需要加上执行权限 chmod a+x AgoraCoreService
-
问题五 录制指令报错 error: 5 和Error in mediasdk: 101
原因: error: 5,APPID异常,可能因为token传入错误导致没能正确的解析出AppId。即:录制参数–channelKey 传入的数据有误
JavaWeb-Backend-Demo
背景
当涉及到后端开发时,javaweb-backend-demo 成为了大多数开发者的选择。我将 Java SDK 整合至后端,为前端开发人员提供了便捷的接口调用,使得开发流程更加高效。
项目介绍
-
接口说明:
Endpoint HTTP Method Request Type Request Body Response Status Codes Response Body /record/getProp
GET
- None 200 - 5XX Default recording configuration information /record/test
GET
- None 200 - 5XX “test ok” /record/start
POST
JSON { "appId": "string", "channel": "string", "uid": "string" }
200 - 5XX “Recording started successfully” or Error message /record/stop
POST
Query Parameter None 200 - 5XX “Recording stop successfully” or Error message /record/help
GET
- None - Help message with available commands -
集成 JavaWeb 注意事项
如果有小伙伴自己集成SDK,可能会在运行项目时遇到如下错误:
错误描述: java.lang.UnsatisfiedLinkError: com.douyu.wsd.record.sdk.RecordingSDK.createChannel(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILcom/douyu/wsd/record/sdk/common/RecordingConfig;)Z
原因: 集成java sdk时,不要更改java文件存放目录,需要按照demo中的包名放置
最后
GitHub 项目 javaweb-backend-demo 的开发经过了不小的努力。如果这个项目对你有所帮助,请别忘了给点一颗星星,将不胜感激。