短视频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类来控制,其接口和基础录制的接口设置方法类似,更多信息请参见基础录制。