描述
在客户端使用 RTCLib SDK 进行音视频会议或直播时,可以获取和录制本地发布的音频数据,并存储到本地。
分析(根因分析、需求分析)
为了获取音频数据,我们需要使用 RTCLib SDK 的 RCRTCMicOutputStream 以下代理方法:
- 获取麦克风采集的音频数据:
recordAudioDataCallback
- 获取本地发送的音频数据 :
willSendAudioBufferCallback
解决方案
源代码
可以先导入下面的工具类,然后根据步骤实现对应功能:
- PRTCSteamRecordFileManager.h (754 字节)
- PRTCSteamRecordFileManager.m (2.7 KB)
- PRTCAudioAACEncoder.h (759 字节)
- PRTCAudioAACEncoder.m (9.7 KB)
- PRTCAudioAACConfiguration.h (2.9 KB)
- PRTCAudioAACConfiguration.m (6.9 KB)
录制并存储本地发送的音频
RTCLib SDK 会将采集的麦克风数据通过 recordAudioDataCallback
返回给应用层。在发往服务端前,RTCLib SDK 还会通过 willSendAudioBufferCallback
返回经过本地混音、音频合流等处理的音频数据。
以下步骤以录制本地发送的音频数据为例:
-
引用对应的头文件
PRTCSteamRecordFileManager.h
并调用创建存储文件的方法,传空默认会在沙盒目录下创建Documents/RCRTCDemo/audio
的文件来存储录制内容:[[PRTCSteamRecordFileManager shareManager] createMediaFileFolderName:@"" audioFolderName:@""];
-
实现本地发送的音频数据回调的方法,通过开关控制是否进行文件的录制:
@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; }
-
当不需要继续录制时,将录制开关关闭并销毁
PRTCAudioAACEncoder
对象:self.aacEncoder = nil; self.haveRecord = NO;
最后,录制成功的文件会保存在改 App 下对应的沙盒路径中:
链接
实时音视频服务端已提供云端录制功能。
更多支持
如有疑问,欢迎提交工单。