短视频SDK提供视频合拍功能,使用一个已有视频作为样本视频,与摄像头采集的数据按照特定的布局方式(例如左右分屏,上下分屏,画中画等)进行合拍录制,合拍视频的每一帧画面将会同时包含两路视频的画面,而音频则采用样本视频的音频。视频合拍是基础录制的功能升级,相比基础录制,视频合拍增加了一个新的本地视频轨道。

版本支持

版本 是否支持
专业版 支持
标准版 支持
基础版 不支持

概念介绍

在以下文档介绍中将提及一些特殊概念,为方便开发者理解,可预先对视频合拍轨道轨道布局的概念做相关了解。

相关类功能

名称 功能
AliyunMixRecorder 合拍功能核心类,包括录制、设置预览、设置特效、设置回调等视频合拍的核心录制功能。
AliyunMixMediaInfoParam 合拍参数配置类,包括摄像头窗口的位置大小,样本播放视频的位置大小等参数。
AliyunMixMediaRecordVideoInfo 采集视频配置类,设置视频采集分辨率。
AliyunMixMediaFileVideoInfo 样本视频配置类,设置样本视频的文件路径、参与合拍的视频开始时间和结束时间。

合拍流程

说明 合拍录制功能需要获取摄像头和麦克风权限,否则无法录制。

视频合拍流程与基础录制流程基本相同,主要差别在于配置录制参数时设置输入输出参数以及设置预览View上的差别。

阶段 流程 说明 示例代码
基础 1 创建录制接口,并配置录制参数。 创建合拍参数配置
2 回调设置。 回调设置
3 设置开启或结束预览。 预览控制
4 开始录制或停止录制。 开始录制
5 创建结束录制相关信息。 结束录制
进阶 6 视频合拍同基础录制一样,同样支持配置美颜、滤镜、背景音乐等录制特效,支持设置拍照等功能。 其他设置

创建合拍参数配置

设置合拍参数,作为合拍实例的初始化参数。代码中需要使用的参数详情,请参考接口文档。接口链接请参见相关类功能

设置合拍参数

AliyunMixMediaInfoParam *mixMediaInfo = [[AliyunMixMediaInfoParam alloc] init];
mixMediaInfo.outputSizeView = previewView;
mixMediaInfo.mixVideoInfo.filePath = mixVideoFile; // 样本视频路径

设置布局参数

合拍两路视频布局的坐标系与系统一致,此处以设置画中画布局为例。
// 设置样本视频窗口大小与位置:置于底层,覆盖全窗口
CGFloat mixWidth = previewView.bounds.size.width;
CGFloat mixHeight = previewView.bounds.size.height;
mixMediaInfo.mixVideoInfo.frame = CGRectMake(0, 0, mixWidth, mixHeight);
mixMediaInfo.mixVideoInfo.layerLevel = 1;

// 设置拍摄视频,比例为竖屏方向9:16,录制分辨率为360P,放在右下角,在样本视频上方
CGFloat recordRatio = 9.0 / 16.0;
mixMediaInfo.recordVideoInfo.resolution = CGSizeMake(360, 360 / recordRatio); 
CGFloat recordHeight = previewView.bounds.size.height * 0.5;
CGFloat recordWidth = recordHeight * recordRatio;
mixMediaInfo.recordVideoInfo.frame = CGRectMake(previewView.bounds.size.width - recordWidth - 4.0, previewView.bounds.size.height - recordHeight - 4, recordWidth, recordHeight);
mixMediaInfo.recordVideoInfo.layerLevel = 2;
设置其他参数
// 样本视频边框设置,非必须
mixMediaInfo.mixVideoInfo.borderInfo.color = UIColor.blueColor;
mixMediaInfo.mixVideoInfo.borderInfo.width = 2;
mixMediaInfo.mixVideoInfo.borderInfo.cornerRadius = 6.0;

// 拍摄视频边框设置,非必须
mixMediaInfo.recordVideoInfo.borderInfo.color = UIColor.blueColor;
mixMediaInfo.recordVideoInfo.borderInfo.width = 1;
mixMediaInfo.recordVideoInfo.borderInfo.cornerRadius = 6.0;

创建合拍对象

创建合拍对象时与基础录制的参数类似,更多信息请参见基础录制
AliyunMixRecorder *_recorder = [[AliyunMixRecorder alloc] initWithMediaInfo:mixMediaInfo outputSize:CGSizeMake(720, 720)];
_recorder.outputType = AliyunIRecorderVideoOutputPixelFormatType420f;
_recorder.useFaceDetect = YES;
_recorder.faceDetectCount = 2;
_recorder.faceDectectSync = NO;
_recorder.frontCaptureSessionPreset = AVCaptureSessionPreset1280x720;
_recorder.GOP = 250;
_recorder.videoQuality = AliyunVideoQualityHight;
_recorder.recordFps = 30;
_recorder.outputPath = [taskPath stringByAppendingPathComponent:@"output.mp4"];
_recorder.cameraRotate = 0;
_recorder.beautifyStatus = YES;
_recorder.frontCameraSupportVideoZoomFactor = YES;

self.aliyunMixRecorder = _recorder;
设置拍摄时长
说明 最终合拍合成视频的时长,取决于两路视频的最长的时长。假设录制视频时长为10s,样本视频时长为5s,那么输出的合拍视频时长为10s。
// 建议合拍最长时长与样本视频时长一致,达到最大时长时,触发recorderDidStopWithMaxDuration回调
AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:[self resourcePath:mixVideoPath]]];
[self.aliyunMixRecorder setRecordMaxDuration:asset.aliyunVideoDuration];
[self.aliyunMixRecorder setRecordMinDuration:1.0];
设置合拍背景
// 设置合拍颜色
[self.aliyunMixRecorder setBackgroundColor:0xFF0100];

// 设置合拍背景图片
NSString *imgPath = [self.class resourcePath:@"pig.jpeg"];
[self.aliyunMixRecorder setBackgroundImageFilePath:imgPath imageDisplayMode:AliyunMixVideoBackgroundImageModeScaleAspectFit];

设置输出音频

支持设置录音回声消除效果,支持两路音频混音、单路输出,或静音。
说明 如果输出视频静音,或仅输出样本视频音频,可以不开启回声消除。
// 设置硬件回声消除效果,推荐使用Hardware模式
self.aliyunMixRecorder.recorderAECType = AliyunIRecorderAECTypeHardware;

// 设置合成视频使用录制音轨
[self.aliyunMixRecorder setMixAudioSource:MixAudioSourceTypeBoth];
[self.aliyunMixRecorder setMixAudioOriginalWeight:50 recordWeight:50];

回调设置

通过设置回调,及时获取音视频处理的进展和状态。代码中需要使用的参数详情,请参考接口文档。接口链接请参见相关类功能

- (void)recorderDeviceAuthorization:(AliyunIRecorderDeviceAuthor)status {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (status == AliyunIRecorderDeviceAuthorAudioDenied) {
            [DeviceAuthorization openSetting:@"麦克风无权限"];
        } else if (status == AliyunIRecorderDeviceAuthorVideoDenied) {
            [DeviceAuthorization openSetting:@"摄像头无权限"];
        }
    });
}

// 录制进度
- (void)recorderVideoDuration:(CGFloat)duration {
    NSLog(@"Mix Record Video Duration: %f", duration);
}

// 停止一段录制
- (void)recorderDidStopRecording {
    NSLog(@"Mix Record Stop Recording");
}

// 录制达到最大录制时长而停止,可以结束录制
- (void)recorderDidStopWithMaxDuration {
    NSLog(@"Mix Record Stop Recording With Max Duration");
    [self.aliyunMixRecorder finishRecording]; // 完成录制
}

// 录制完成
- (void)recorderDidFinishRecording {
    NSLog(@"Mix Record Did Finish Recording");
}

// 合拍完成合成
- (void)mixRecorderComposerDidComplete {
    NSLog(@"Mix Record Complete");
    [[MBProgressHUD HUDForView:self.view] hideAnimated:YES];
}

// 合成出现错误
- (void)mixRecorderComposerDidError:(int)errorCode {
    NSLog(@"Mix Record Error");
    [[MBProgressHUD HUDForView:self.view] hideAnimated:YES];
}

// 合拍开始进行合成
- (void)mixRecorderComposerDidStart {
    NSLog(@"Mix Record Start");
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeDeterminate;
    hud.removeFromSuperViewOnHide = YES;
    hud.label.text = @"合成中...";
}

// 合拍合成结束
- (void)mixRecorderComposerOnProgress:(CGFloat)progress {
    NSLog(@"Mix Record Progress: %f", progress);
    MBProgressHUD *hub = [MBProgressHUD HUDForView:self.view];
    hub.progress = progress / self.aliyunMixRecorder.recordDuration;
}

预览控制

代码中需要使用的参数详情,请参考接口文档。接口链接请参见相关类功能

// 开启预览
[self.aliyunMixRecorder startPreviewWithPositon:AliyunIRecorderCameraPositionFront];

// 结束预览,通常在完成录制后,调用结束预览
[self.aliyunMixRecorder stopPreview];

开始录制

startRecording和stopRecording需要成对出现,可以调用一次或多次,对应SDK内部会生成一段或多段临时视频文件。代码中需要使用的参数详情,请参考接口文档。接口链接请参见相关类功能

// 开始录制一段视频
[self.aliyunMixRecorder startRecording];  

// 停止录制一段视频
[self.aliyunMixRecorder stopRecording];

结束录制

录制完成后,调用finishRecording接口进行两路视频合成。代码中需要使用的参数详情,请参考接口文档。接口链接请参见相关类功能

// 结束录制,进行两路视频合成
[self.aliyunMixRecorder finishRecording];

其他设置

视频合拍同基础录制一样,同样支持配置美颜、滤镜、背景音乐等录制特效,支持设置拍照等功能,通过AliyunMixRecorder类来控制,其接口和基础录制的接口设置方法类似,更多信息请参见基础录制