如何录制本地发布的音频

描述

在客户端使用 RTCLib SDK 进行音视频会议或直播时,可以获取和录制本地发布的音频数据,并存储到本地。

分析(根因分析、需求分析)

为了获取音频数据,我们需要使用 RTCLib SDK 的 RCRTCMicOutputStream 以下代理方法:

解决方案

源代码

可以先导入下面的工具类,然后根据步骤实现对应功能:

录制并存储本地发送的音频

RTCLib SDK 会将采集的麦克风数据通过 recordAudioDataCallback 返回给应用层。在发往服务端前,RTCLib SDK 还会通过 willSendAudioBufferCallback 返回经过本地混音、音频合流等处理的音频数据。

以下步骤以录制本地发送的音频数据为例:

  1. 引用对应的头文件 PRTCSteamRecordFileManager.h 并调用创建存储文件的方法,传空默认会在沙盒目录下创建 Documents/RCRTCDemo/audio 的文件来存储录制内容:

    [[PRTCSteamRecordFileManager shareManager] createMediaFileFolderName:@""
                                                         audioFolderName:@""];
    
  2. 实现本地发送的音频数据回调的方法,通过开关控制是否进行文件的录制:

    @property (nonatomic, strong) PRTCAudioAACEncoder *aacEncoder;
    @property(nonatomic, assign) BOOL haveRecord;
    
    - (void)record {
        self.haveRecord = YES;
        __weak typeof(self) weakSelf = self;
        [[RCRTCEngine sharedInstance].defaultAudioStream setWillSendAudioBufferCallback:^(UInt32 inNumberFrames, AudioBufferList * _Nonnull ioData, const AudioTimeStamp * _Nonnull inTimeStamp, const AudioStreamBasicDescription asbd) {
            if (weakSelf.haveRecord) {
                NSData *audioData = [NSData dataWithBytes:ioData->mBuffers[0].mData length:ioData->mBuffers[0].mDataByteSize];
                [[weakSelf aacEncoderAudioBufferList:ioData->mBuffers[0].mNumberChannels] encodeAudioData:audioData timeStamp:nil];
            }
        }];
    }
    
    - (PRTCAudioAACEncoder *)aacEncoderAudioBufferList:(int32_t)channels {
        if (!_aacEncoder) {
            ///aac 编码配置
            PRTCAudioAACConfiguration *configuration = nil;
            if (channels == 1) {
                configuration = [PRTCAudioAACConfiguration defaultOneChannelsConfiguration];
            }else {
                configuration = [PRTCAudioAACConfiguration defaultDoubleChannelsConfiguration];
            }
            _aacEncoder = [[PRTCAudioAACEncoder alloc] initWithAudioStreamConfiguration:configuration];
        }
        return _aacEncoder;
    }
    
  3. 当不需要继续录制时,将录制开关关闭并销毁 PRTCAudioAACEncoder 对象:

        self.aacEncoder = nil;
        self.haveRecord = NO;
    

最后,录制成功的文件会保存在改 App 下对应的沙盒路径中:

链接

实时音视频服务端已提供云端录制功能。

更多支持

如有疑问,欢迎提交工单