快速开始

Hi, 亲爱的开发者,欢迎使用云知芯短视频SDK。如下内容将引导您在自己的IOS工程中集成短视频录制,编辑及导出功能。首先,我们假定您已了解 Objective-C 的基础语法。

添加依赖

需要进入云知芯控制台创建所需且匹配业务的SDK,后将MovieousShortVideo引入工程中。

引入相关头文件

在您需要集成短视频SDK的页面源文件中添加如下语句

snippet.objectivec
#import 

下面,可以根据自己的需求,选择性地集成视频录制、视频编辑或视频导出模块

视频录制

普通列表项目添加麦克风和摄像头使用权限 打开项目配置页面,Info 选项添加 Privacy - Camera Usage DescriptionPrivacy - Microphone Usage Description 描述

生成音频和视频的配置对象并根据需求进行相关参数的更改

snippet.objectivec
    MSVRecorderAudioConfiguration *audioConfiguration = [MSVRecorderAudioConfiguration defaultConfiguration];
    MSVRecorderVideoConfiguration *videoConfiguration = [MSVRecorderVideoConfiguration defaultConfiguration];
    // 根据需求更改需要更改的参数,不更改则使用默认参数
    videoConfiguration.cameraResolution = AVCaptureSessionPreset1280x720;
    videoConfiguration.cameraPosition = AVCaptureDevicePositionFront;

生成录制核心控制对象

snippet.objectivec
    _recorder = [[MSVRecorder alloc] initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration error:&error];
    if (error) {
        SHOW_ERROR_ALERT;
        return;
    }
    // 设置最大录制长度
    _recorder.maxDuration = 10;
    // 设置录制事件回调
    _recorder.delegate = self;
    // 将预览视图插入视图栈中,以便预览摄像头采集结果
    _recorder.preview.frame = self.view.frame;
    [self.view insertSubview:_recorder.preview atIndex:0];

开始音视频采集

snippet.objectivec
    [_recorder startCapturingWithCompletionHandler:^(BOOL audioGranted, NSError *audioError, BOOL videoGranted, NSError *videoError) {
        if (videoError) {
            SHOW_ALERT(@"error", videoError.localizedDescription, @"ok");
            return;
        }
        if (!videoGranted) {
            SHOW_ALERT(@"warning", @"video not authorized", @"ok");
            return;
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self syncBeautyParams];
        });
        if (audioError) {
            SHOW_ALERT(@"error", audioError.localizedDescription, @"ok");
            return;
        }
        if (!audioGranted) {
            SHOW_ALERT(@"warning", @"audio not authorized", @"ok");
            return;
        }
    }];

开始录制片段

snippet.objectivec
    if (![_recorder startRecordingWithClipConfiguration:config error:&error]) {
        SHOW_ERROR_ALERT;
        return;
    }

完成当前片段录制

snippet.objectivec
    [_recorder finishRecordingWithCompletionHandler:^(MSVMainTrackClip *clip, NSError *error) {
        // 从生成的 clip 对象中可以获取到当前录制片段生成的 mp4 文件及相关描述信息
        if (error) {
            SHOW_ERROR_ALERT;
        }
    }];

完成当前片段录制之后还可以回到开始录制片段的步骤继续进行下一个片段的录制,所有录制好的片段将会顺序拼接为一个视频草稿保存在 _recorder.draft 对象中,可传入编辑器进行编辑或传入导出器直接导出为一个合成后的文件

视频编辑

创建编辑器核心控制类

snippet.objectivec
    // 此处的 draft 可以使用在录制阶段生成的也可以使用已有音视频资源(例如系统相册或从远端下载等)创建
    _editor = [MSVEditor createSharedInstanceWithDraft:_draft error:&error];
    if (error) {
        SHOW_ERROR_ALERT;
        return;
    }
    _editor.delegate = self;
    // 将预览视图插入视图栈中,以便预览编辑结果
    _previewContainer.preview = _editor.preview;
    _editor.loop = YES;

预览草稿

snippet.objectivec
    [_editor play];
  • 进行视频编辑 MovieousShortVideo 使用 MSVDraft 对象存储视频的编辑信息,你可以根据需求对 _editor.draft 的参数进行任意调整,调整之后预览视图会实时刷新为调整参数之后的内容,下面演示一下对视频进行剪辑操作 objectivec _editor.draft.timeRange = (MovieousTimeRange){ // 需要剪辑的部分的开始时间 startTime, // 需要剪辑的部分的时长 duration, };

视频导出

创建导出核心控制对象

snippet.objectivec
    NSError *error;
    // 创建导出控制对象
    _exporter = [[MSVVideoExporter alloc] initWithDraft:_draft error:&error];
    if (error) {
        SHOW_ERROR_ALERT;
        return;
    }
    // 将导出结果保存到相册中
    _exporter.saveToPhotosAlbum = YES;
    __weak typeof(self) wSelf = self;
    // 进度回调
    _exporter.progressHandler = ^(float progress) {
        NSLog(@"progress: %f", progress);
    };
    // 完成回调
    _exporter.completionHandler = ^(NSURL *URL) {
        SHOW_ALERT_FOR(@"完成", @"成功导出", @"知道啦", wSelf);
    };
    // 失败回调
    _exporter.failureHandler = ^(NSError *error) {
        SHOW_ERROR_ALERT_FOR(wSelf);
    };

开始导出

snippet.objectivec
    [_exporter startExport];