聲網(agora)雲端錄製(頁面錄製)實踐總結
阿新 • • 發佈:2020-12-30
技術標籤:聲網Agoraagora錄製聲網錄製雲端錄製聲網頁面錄製
近來使用聲網的雲端錄製功能中的頁面錄製,來實現使用者視角的課程回放視訊錄製。由於是聲網剛新出的功能,文件不是很詳細,所以踩了一些坑。在此記錄一二。
注:聲網頁面錄製文件地址:https://docs.agora.io/cn/cloud-recording/cloud_recording_webpage_mode?platform=RESTful
由於功能是新上的,所以文件不太完善,因此還需要參考:https://docs.agora.io/cn/cloud-recording/cloud_recording_api_rest?platform=RESTful
目前還處於公測期。公測期期間,可以免費使用。
使用前,要確保開通了雲端錄製功能,且要將聲網APPID、錄製功能所需的key 、secret記下來(注意不是CustomerID和CustomerCertificate)。還要注意的是,聲網錄製開始時間和結束時間,都是由我們自己控制的
(當請求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; }