human: 如何处理七牛云的实时音视频音视频本地录制

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > iOS >音视频本地录制

#  音视频本地录制

最近更新时间: 2024-06-28 16:41:07

本文主要介绍连麦过程中音视频本地录制的使用场景。

>   * v6.2.0 版本开始支持使用
> [QNMediaRecorder](https://developer.qiniu.com/rtc/api/12685/QNMediaRecorder-
> iOS) 进行音视频本地录制的操作
>   * 在 [QNRTC deinit] 之前，请先停止录制
>   * 支持录制格式：wav、aac、mp4
>   * 录制保存路径可自定义，未设置则使用默认路径 App Container/Library/Caches/Pili/RecordFile
>   * 音频 Track 添加混音时，混音数据不支持参与录制保存
>

使用方式如下：

# 创建 QNMediaRecorder

SDK 当前支持基于
[QNLocalVideoTrack](https://developer.qiniu.com/rtc/api/8849/QNLocalVideoTrack-
iOS) 和
[QNLocalAudioTrack](https://developer.qiniu.com/rtc/api/8854/QNLocalAudioTrack-
iOS) 的录制功能，可以通过
[QNRTC.createMediaRecorder](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#createMediaRecorder) 来创建
[QNMediaRecorder](https://developer.qiniu.com/rtc/api/12685/QNMediaRecorder-
iOS) 对象

    
    
    QNMediaRecorder *mediaRecorder = [QNRTC createMediaRecorder];
    mediaRecorder.delegate = self;
    

其中，[QNMediaRecorderDelegate](https://developer.qiniu.com/rtc/api/12688/QNMediaRecorderDelegate-
iOS) 为音视频本地录制回调代理，回调方法定义如下：

    
    
    /*!
     * @abstract 录制信息更新回调
     *
     * @param recorder 媒体录制实例
     *
     * @param info 媒体录制完成的信息
     *
     * @since v6.2.0
     */
    - (void)mediaRecorder:(QNMediaRecorder* _Nonnull)recorder infoDidUpdated:(QNMediaRecordInfo* _Nonnull)info;
      
    /*!
     * @abstract 录制状态发生变化回调
     *
     * @warning 出现错误状态时，会自动停止录制并回调错误信息
     *
     * @param recorder 媒体录制实例
     *
     * @param state 录制状态
     *
     * @param reason 录制错误信息
     *
     * @since v6.2.0
     */
    - (void)mediaRecorder:(QNMediaRecorder* _Nonnull)recorder stateDidChanged:(QNMediaRecorderState)state reason:(QNMediaRecorderReasonCode)reason;
    

音视频本地录制的错误码可参考[录制相关错误码](https://developer.qiniu.com/rtc/development_guidelines/10084/rtc-
error-code-iOS#7)

# 开始录制

需要设置录制相关配置参考如下：

  * **文件路径** ：请确保路径完整精确到文件名和类型，存在有效且可读可写，支持 wav、aac、mp4，不设置默认保存在 App Container/Library/Caches/Pili/RecordFile。
  * **音频源** ：可以设置麦克风或自定义音频，仅支持一路音频轨的设置，重复设置会被覆盖。
  * **视频源** ：可以设置摄像头或自定义视频，仅支持一路视频轨的设置，重复设置会被覆盖。

参考代码如下：

    
    
    QNLocalAudioTrack *audioInfo = [QNRTC createMicrophoneAudioTrack];
    QNLocalVideoTrack *videoInfo = [QNRTC createCameraVideoTrack];
    
    QNMediaRecorderConfig *mediaConfig = [[QNMediaRecorderConfig alloc] initWithFilePath:@"" localAudioTrack:audioInfo localVideoTrack:videoInfo];
    
    int result = [mediaRecorder startRecording:mediaConfig];
    if (result != 0) {
        NSLog(@"开始录制发生错误 %ld", result);
    }
    

# 停止录制

参考代码如下：

    
    
    int result = [mediaRecorder stopRecording];
    if (result != 0) {
        NSLog(@"结束录制发生错误 %ld", result);
    }
    

# 错误码

错误码通过
[QNMediaRecorderDelegate](https://developer.qiniu.com/rtc/api/12688/QNMediaRecorderDelegate-
iOS) 的 `stateDidChanged`
[QNMediaRecorderReasonCode](https://developer.qiniu.com/rtc/api/9254/QNTypeDefines#QNMediaRecorderReasonCode)
回调

    
    
    typedef NS_ENUM(NSInteger, QNMediaRecorderReasonCode) {
        /*!
         * @abstract No error 一切正常
         */
        QNMediaRecorderReasonCodeNoError = 0,
        
        /*!
         * @abstract Format failed 封装格式操作失败
         */
        QNMediaRecorderReasonCodeFormatFailed  = 40001,
        
        /*!
         * @abstract Stream failed 流信息操作失败
         */
        QNMediaRecorderReasonCodeStreamFailed  = 40002,
        
        /*!
         * @abstract Write failed 录制过程中写入失败
         */
        QNMediaRecorderReasonCodeWriteFailed  = 40003,
        
        /*!
         * @abstract Resample failed 录制过程中重采样操作失败
         */
        QNMediaRecorderReasonCodeResampleFailed  = 40004,
        
        /*!
         * @abstract No track 没有可录制的流（采集中断或远端取消发布中断超过 5s）
         */
        QNMediaRecorderReasonCodeNoTrack  = 40005,
        
        /*!
         * @abstract Config changed 录制源配置被改变
         */
        QNMediaRecorderReasonCodeConfigChanged  = 40006,
        
        /*!
         * @abstract Out of memory 存储空间不足
         */
        QNMediaRecorderReasonCodeOutOfMemory  = 40007,
        
        /*!
         * @abstract Scale failed 录制过程中缩放操作失败
         */
        QNMediaRecorderReasonCodeScaleFailed  = 40008,
    };
    

# 注意事项

  1. 录制实现相关配置时，应当务必保证保存地址、Track 有效可用
  2. 建议实现[QNMediaRecorderDelegate](https://developer.qiniu.com/rtc/api/12688/QNMediaRecorderDelegate-iOS)回调，对应实际状态做相应处理
  3. 开始录制或停止录制时，根据返回值的结果做相应的业务处理，可避免后续非预期行为
  4. 对自定义音视频进行录制时，应当确保音视频同步传入，否则可能存在音频录制后播放非预期的情况

# 示例代码

音视频本地录制场景的示例代码可参考 [API-Examples-iOS](https://github.com/pili-
engineering/QNRTC-iOS/blob/master/QNRTC-API-Examples/Api-Examples-
iOS/Module/Other/MediaRecord/MediaRecordExample.m)

以上内容是否对您有帮助？