1. 程式人生 > 其它 >聲網(agora)雲端錄製(頁面錄製)實踐總結

聲網(agora)雲端錄製(頁面錄製)實踐總結

技術標籤:聲網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;
    }