小程序开发定制近来使用声网的云端录小程序开发定制制功能中的页面录制,小程序开发定制来实现用户视角的课程小程序开发定制回放视频录制。小程序开发定制由于是声网刚新出的功能,文档不是很详细,所以踩了一些坑。在此记录一二。
注:声网页面录制文档地址:
由于功能是新上的,所以文档不太完善,因此还需要参考:
目前还处于公测期。公测期期间,可以免费使用。
使用前,要确保开通了云端录制功能,且要将声网APPID、录制功能所需的key 、secret记下来。还要注意的是,声网录制开始时间和结束时间,都是由我们自己控制的
(当请求start接口时,就开始录制了,当请求stop接口时,就停止录制了。)
1.接口请求header信息需要增加:Authorization
或者直接在headers 中加入
2.请求acquire
3.请求start
4.请求stop
请求三个接口即可完成录制(以下代码只是简单示例---只提供大致代码,重点注解。)。
- /** 简单示例(只提供大致代码,重点注解。并不完全):开始录制
- * @param $data
- * @return bool
- */
- public function start($data)
- {
-
- //请求声网接口开始录制
- $data['prefix'] = empty($data['prefix']) ? 'test' : $data['prefix']; //文件名前缀
- $data['hour'] = empty($data['hour']) ? 72 : $data['hour']; //设置云端录制 RESTful API 的调用时效
- //录制视频设置
- $data['fps'] = empty($data['fps']) ? 15 : $data['fps'];
- $data['width'] = empty($data['width']) ? 960 : $data['width'];
- $data['height'] = empty($data['height']) ? 720 : $data['height'];
- //存储设置
- $data['file_path'] = empty($data['file_path']) ? 'agoraRecordVideo' : $data['file_path']; //路径
-
- $baseStartUrl = $this->option['RestUrl'] . $this->option['AppID'] . '/cloud_recording/resourceid/';
- $base64Credentials = base64_encode($this->option['Key'] . ':' . $this->option['Secret']);
-
- // 请求头
- $header = [
- 'Authorization' => 'Basic ' . $base64Credentials,
- 'Content-type' => 'application/json;charset=utf-8'
- ];
-
- $cname = $data['prefix'] . '-' . 'name';
- $uid = (string) 1 //此处uid需要保持唯一性;
-
- $acquireData = [
- 'rest_url' => $this->option['RestUrl'],
- 'app_id' => $this->option['AppID'],
- 'base64_credentials' => $base64Credentials,
- 'hour' => $data['hour'],
- 'cname' => $cname,
- 'uid' => $uid
- ];
- $acquireRes = self::getAgoraResourceId($acquireData);
-
- if (!$acquireRes['resourceId']) {
-
- Log::error(['message' => '声网返回resourceId错误', 'agora' => $acquireRes], 'startAgoraRecordVideo');
-
- $this->addError('获取声网录resourceId错误,录制失败');
- return false;
- }
-
- $startUrl = $baseStartUrl . $acquireRes['resourceId'] . '/mode/web/start';
-
- $url = 'www.baidu.com' //你需要录制的页面地址;
-
- $startData = [
- 'cname' => $cname,
- 'uid' => $uid,
- 'clientRequest' => [
- 'token' => '',
- 'extensionServiceConfig' => [
- 'errorHandlePolicy' => 'error_abort',
- 'extensionServices' => [
- [
- 'serviceName' => 'web_recorder_service',
- 'errorHandlePolicy' => 'error_abort',
- 'serviceParam' => [
- 'url' => $url,
- 'videoFps' => $data['fps'], //帧率
- 'audioProfile' => 1, //48 kHz 采样率,音乐编码,单声道,编码码率约 128 Kbps
- 'videoWidth' => $data['width'],
- 'videoHeight' => $data['height'],
- 'maxRecordingHour' => $data['hour'], //最大录制时长
- ]
- ]
- ]
- ],
- 'recordingConfig' => [
- 'maxIdleTime' => 86400 //不设置的话默认为30s:即推流中断30s,就会停止录制,建议设置此项
- ],
- 'recordingFileConfig' => [
- 'avFileType' => [
- 'mp4', 'hls'
- ]
- ],
- 'storageConfig' => [ //此处为第三方存储,可以设置其他存储
- 'vendor' => 0, //七牛云
- 'region' => 2, //华南
- 'bucket' => '', //七牛云bucket
- 'accessKey' => '',//七牛云accessKey
- 'secretKey' => '',//七牛云secretKey
- 'fileNamePrefix' => [
- $data['file_path']
- ]
- ]
- ],
- ];
-
- $startRes = HttpRequest::post($startUrl, $startData, $header);
-
- //成功,更新状态为开始录制 失败不更新
- if ($startRes['sid']) {
- $record= [
- 'file_path' => $data['file_path'],
- 'cname' => $cname,
- 'uid' => $uid,
- 'sid' => $startRes['sid'],
- 'resource_id' => $startRes['resourceId']
- ];
-
- /*****************以上数据应记录,以供后用******************/
- 记录代码省略....
-
- } else {
- Log::error(['message' => '声网返回sid错误', 'agora' => $startRes], 'startAgoraRecordVideo');
-
- $this->addError('声网返回sid错误,录制失败');
- return false;
- }
-
- return true;
- }
-
- /** 简单示例(只提供大致代码,重点注解。并不完全)停止录制
- * @param $data
- * @return bool
- */
- public function stop($data)
- {
- $record //record 为开始录制后记录下的数据
-
- $stopUrl = $this->option['RestUrl'] . $this->option['AppID'] . '/cloud_recording/resourceid/' . $record['resource_id'] . '/sid/' . $record['sid'] . '/mode/web/stop';
- $base64Credentials = base64_encode($this->option['Key'] . ':' . $this->option['Secret']);
-
- // 请求头
- $header = [
- 'Authorization' => 'Basic ' . $base64Credentials,
- 'Content-type' => 'application/json;charset=utf-8'
- ];
-
- $stopData = [
- 'cname' => $record['cname'],
- 'uid' => $record['uid'],
- 'clientRequest' => (object)null //此处需传空对象
- ];
-
- $qiniuUrl = Yii::$app->params['qiniu']['host']; //文件存储地址host
-
- $stopRes = HttpRequest::post($stopUrl, $stopData, $header);
-
- if (!empty($stopRes['serverResponse']['extensionServiceState'])) {
- $name = $stopRes['serverResponse']['extensionServiceState'][1]['payload']['fileList'][1]['filename'];
-
- $record = [
- 'file_url' => $qiniuUrl . $record['file_path'] . '/' . $name,
- ];
- /***************得到录制文件地址****************/
-
- } else {
- Log::error(['message' => '声网停止录制文件错误', 'agora' => $stopRes], 'stopAgoraRecordVideo');
- }
-
- return true;
- }
-
- /**
- * 声网acquire接口获取resourceId
- * @param $data
- * @return bool|mixed|string
- */
- public static function getAgoraResourceId($data)
- {
- $acquireUrl = $data['rest_url'] . $data['app_id'] . '/cloud_recording/acquire';
- // 请求头
- $header = [
- 'Authorization' => 'Basic ' . $data['base64_credentials'],
- 'Content-type' => 'application/json;charset=utf-8'
- ];
- $acquireData = [
- 'cname' => $data['cname'],//区分录制进程
- 'uid' => $data['uid'],
- 'clientRequest' => [
- 'resourceExpiredHour' => $data['hour'],
- 'scene' => 1
- ]
- ];
-
- $acquireRes = HttpRequest::post($acquireUrl, $acquireData, $header);
-
- return $acquireRes;
- }