虚拟形象视频录制怎么弄(虚拟形象SDK功能系列2)

在前面的文章《基于ZEGO 虚拟形象SDK实现AI捏脸》我们分享过AI捏脸这一常用功能。视频录制作为高频需求,可以用来记录虚拟形象的精彩时刻,为视频讲解增色添彩等方面。

ZEGO虚拟形象SDK 提供了视频录制功能,支持用户随时把 Avatar 虚拟形象录制成视频,同时也可以将麦克风采集的声音录制到视频中。

下面我们来看看具体怎么实现。

前提条件

在实现“录制视频”功能之前,请确保:

  • 已在项目中集成了 Avatar SDK,详情请参考 集成 SDK
  • 已参考 创建虚拟形象,完成基本的虚拟人物形象搭建。

实现流程

开发者请参考以下步骤,实现 “录制视频” 功能。

启动视频录制

注意:开始视频录制前

  • 如果要保存到手机相册,请先配置 Privacy - Photo Library Additions Usage Description 权限。
  • 如果需要录制麦克风声音,请先配置 Privacy - Microphone Usage Description 权限。

配置方法请参考 设置权限

搭建出基本的虚拟人物形象后,调用 ZegoAvatarView startRecord 接口,传入录制视频的配置参数 ZegoRecordConfig,其中 videoPath 指视频保存路径,必填。默认录制视频为 .mp4 格式。

// 自定义视频录制保存的路径,并确保路径存在
NSString *docDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
_videoPath = [NSString stringWithFormat:@"%@/avatar.mp4", docDir];
// 拼装路径
ZegoRecordConfig *config = [ZegoRecordConfig new];
// 必填: 指定视频保存位置
config.videoPath = _videoPath;
// 可选: 是否录制音频
config.recordAudio = true;
// 可选: 指定视频的格式, 默认为 MP4 格式, 也可以录制 mov 格式, 但兼容性很差, android 设备无法播放, 不建议使用
config.recordMode = ZegoAvatarRecordModeMP4;
// 可选: 默认使用 _avatarView 的宽度作为视频宽度, 如果指定, scaleWidth 必须小于 _avatarView 的宽度
config.scaleWidth = _avatarView.frame.size.width;
__weak typeof(self) weakSelf = self;
// 启动录制, 当启动失败返回false(没有权限、创建编码器出错等), 由于录制是在子线程进行的, 录制过程中有错误(帧编码失败等错误), 会通过 callback 回调出来
BOOL success = [_avatarView startRecord:config onStartRecordCallback:^(NSInteger errorCode, NSString *info) {
    if(errorCode != ZegoAvatarErrorCode_Success){
        NSLog(@"Avatar录制出错, code: %ld, msg: %@", (long)errorCode, info);
    }
}];
if (success) {
    [self.view makeToast:@"Avatar录制启动成功"];
}

启动录制失败时,接口会返回 false(失败原因可能为:没有权限、创建编码器出错等)。之后编码运行在子线程,录制过程中若发生错误,会在 callback 中回调出来。

停止视频录制

如果想要停止录制,可调用 ZegoAvatarView 的 stopRecord 接口停止录制,SDK 会把视频内容保存成视频文件,复制到 videoPath 指定的路径中。

__weak typeof(self) weakSelf = self;
// 停止视频录制, 调用后会停止录制, 并把录制的视频文件写到 startRecord 指定的 videoPath
// 如果过程中发生错误, 会在 callback 中回调出来
[_avatarView stopRecord:^{
    // 如果需要保存到相册中,请参考以下代码。
    __strong typeof(self) strongSelf = weakSelf;
    if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(strongSelf.videoPath)) {
        // 保存相册核心代码
        // 如果您使用 iOS 12.0 之前的系统, 使用时,需要加上权限: Privacy - Photo Library Additions Usage Description
        // 注意: video:didFinishSavingWithError:contextInfo: 是自定义的处理保存到相册成功和失败的回调
        UISaveVideoAtPathToSavedPhotosAlbum(strongSelf.videoPath, strongSelf, @selector(video:didFinishSavingWithError:contextInfo:), nil);
    }
}];

自定义音频采集

如果设置了 ZegoRecordConfig 对象的 recordAudio 为 true,SDK 会使用内置的麦克风采集模块采集声音。内置的采集模块在设备兼容性上有所欠缺,ZEGO 推荐开发者使用 Express SDK 进行音频采集,请参考 自定义音频采集与渲染

  1. 开发者需要调用 setCustomAudioDelegate 接口,设置自定义音频数据采集代理(需要继承 AudioDataDelegate 实现 onStart onStop 方法)。
  2. 采集到音频数据后,调用 sendAudioData 接口,发送数据。
// ExpressAudioCaptureDelegate.h
@interface ExpressAudioCaptureDelegate : AudioDataDelegate<IAudioCapture>

@end

// ExpressAudioCaptureDelegate.m
@interface ExpressAudioCaptureDelegate()<ZegoEventHandler, ZegoCustomAudioProcessHandler>
{
    BOOL _isRunning;
}
@end

@implementation ExpressAudioCaptureDelegate

- (void)onStart{
    // 启动音频采集
    _isRunning = YES;
    // 配置 Express,启动自定义音频前处理等等
}

- (void)onStop{
    // 停止音频采集
    _isRunning = NO;
}

// 以下为 Express SDK 的自定义音频采集的前处理回调, 将采集到的数据发送给 Avatar SDK
- (void)onProcessCapturedAudioData:(unsigned char * _Nonnull)data dataLength:(unsigned int)dataLength param:(ZegoAudioFrameParam *)param timestamp:(double)timestamp; {
    if(_isRunning){
        // data: pcm 的原始数据
        // length: data 的长度
        // dataType: data 采集的位数:0 表示 16 位,1 表示 8 位
        // timeStamp: 时间戳, 从启动采集到现在经过的时间,单位 毫秒
        // sendAudioData 是父类方法, 直接调用即可;数据透传给 Avatar SDK, RTC 的数据是 8 位的, dataType 是 1
        [super sendAudioData: (void*)data  size:dataLength dataType: 1 timeStamp: [super getDurationMs] ];
    }
}
@end

小结:接入虚拟形象SDK后,通过以上简单两步就可以实现虚拟形象的视频录制功能,更多功能可访问SDK概况了解。

本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/38340.html

(0)

发表回复

登录后才能评论