短视频SDK提供视频合拍功能,可支持多视频拼接合成,核心类AliyunMixRecorder
和AliyunMixComposer
。
版本 | 功能描述 |
---|---|
专业版 | 支持所有功能 |
标准版 | 支持所有功能 |
基础版 | 不支持 |
名称 | 功能 |
---|---|
AliyunMixRecorder | 合拍功能核心类,能快速实现合拍 |
AliyunMixComposer | 合拍功能核心类,能对多段视频进行拼接合成 |
在以下文档介绍中将提及一些特殊概念,为方便开发者理解,预先对概念做一些讲解。
视频合拍从产品功能层面看,就是两路视频(一路来自样本视频,一路来自设备摄像头采集),按照指定的布局模式(左右分屏,上下分屏,画中画等)进行合成,合成出来的视频每一帧画面将会同时包含两路视频的画面,而合拍视频的音频部分则采用样本视频的音频。以下为范例视图,实际上SDK内部支持开发者自己组织布局,关于如何布局将在后面讲述。
在概念1中提及的两路视频在SDK中被抽象为两个轨道:A轨道和B轨道,A轨放设备采集的视频,B轨放样本视频,用轨道抽象有利于开发者理解轨道布局的概念。
在iOS上,轨道创建时带有trackDisplayFrame
位置属性。代表轨道在最终画面上占据的位置大小,其左上角为(0,0)原点,和系统的坐标系行为一致。如下示例图:
上图中:最终导出的分辨率为640×640,A轨道位置为(0,0,320,640),B轨道位置为(320,0,320,640),在轨道范围上可以加视频。示例代码见文档底部示例代码。
AliyunMixRecorder
提供了快捷的录制和播放画面并存的能力。比如左边部分画面是摄像头采集,右边部分是播放视频。
AliyunMixRecorder
对象,完成初始化。
/**
初始化方法
@param param 媒体信息
@param outputSize 最终的合成分辨率
@return 合拍对象
*/
- (instancetype)initWithMediaInfo:(AliyunMixMediaInfoParam *)param outputSize:(CGSize)outputSize;
对AliyunMixMediaInfoParam
对象描述了合拍的窗口,摄像头窗口的位置大小,样本播放视频的位置大小。具体的解释如下:
/**
合拍窗口View 必须设置
*/
@property(nonatomic, strong) UIView *outputSizeView;
/**
合拍样本视频的窗口大小
内部根据此frame在outputSizeView上展示样本播放窗口
*/
@property(nonatomic, assign) CGRect mixVideoViewFrame;
/**
合拍摄像头采集窗口的大小
内部根据此frame在outputSizeView上展示采集窗口
*/
@property(nonatomic, assign) CGRect previewViewFrame;
/**
合拍摄像头录制的视频分辨率
*/
@property(nonatomic, assign) CGSize previewVideoSize;
/**
参与合拍的视频路径
*/
@property(nonatomic, copy) NSString *mixVideoFilePath;
/**
参与合拍的视频开始时间
*/
@property(nonatomic, assign) CGFloat streamStartTime;
/**
参与合拍的视频结束时间
*/
@property(nonatomic, assign) CGFloat streamEndTime;
AliyunMixRecorder
类的其他接口和普通录制的接口类似。通过此接口实现的合拍流程和普通录制的流程也相似。
/**
开始预览
@param cameraPosition 摄像头位置(前置、后置)
*/
- (void)startPreviewWithPositon:(AliyunIRecorderCameraPosition)cameraPosition;
/**
开始预览 默认前置摄像头
*/
- (void)startPreview;
- (void)stopPreview;
- (void)destroyRecorder;
- (int)startRecording;
- (void)stopRecording;
startRecording
和stopRecording
需要成对出现。
与录制模块的参数设置一致,具体可参阅视频录制
文档
AliyunMixComposer
提供了对多个视频进行拼接的能力,属于底层实现类,能够实现多视频同画面效果,比如左右分屏、画中画、九宫格等效果。
视频流
是指具体用来合成拼接的视频,将加入到视频轨道中。
/**
合成的回调delegate
*/
@property(nonatomic, weak) id<AlivcMixComposerDelegate> delegate;
/**
视频最终导出分辨率 必须设置
*/
@property(nonatomic, assign) CGSize outputSize;
/**
视频最终导出路径 必须设置
*/
@property(nonatomic, copy) NSString *outputPath;
/**
码率 bps
*/
@property(nonatomic, assign) NSInteger bitrate;
/**
视频质量
*/
@property(nonatomic, assign) AliyunVideoQuality videoQuality;
/**
帧率,这里指的是平均帧率 默认:30
*/
@property(nonatomic, assign) CGFloat fps;
/**
关键帧间隔 默认:5
*/
@property(nonatomic, assign) NSInteger gop;
/**
初始化合拍视频轨道
@param trackDisplayFrame 该轨道的分辨率(参考坐标为视频导出分辨率,例如导出分辨率为960*960,trackDisplayFrame设置为(0,0,480,960)说明该轨道占据了左半部分区域)
@return AlivcMixTrack对象
*/
- (AliyunMixTrack *)createTrack:(CGRect)trackDisplayFrame;
/**
指定以某个轨道的时长作为最终合成视频的时长
@param referenceTrack 轨道
*/
- (void)setOutputDurationReferenceTrack:(AliyunMixTrack *)referenceTrack;
/**
指定以某个轨道的音频作为最终合成视频的音频
@param referenceTrack 轨道
*/
- (void)setOutputAudioReferenceTrack:(AliyunMixTrack *)referenceTrack;
AliyunMixStream
对象解析:
/**
视频文件路径
*/
@property(nonatomic, copy) NSString *filePath;
/**
可选参数
视频在所在轨道上展示的视频本身的裁剪范围,在裁剪模式下可用
*/
@property(nonatomic, assign) CGRect innerCropFrame;
/**
视频在轨道上播放的开始时间
单位:秒
*/
@property(nonatomic, assign) CGFloat streamStartTime;
/**
视频在轨道上播放的结束时间
单位:秒
*/
@property(nonatomic, assign) CGFloat streamEndTime;
/**
视频在轨道上的内容填充模式 分为填充模式和裁剪模式
*/
@property(nonatomic, assign) AlivcContentMode mode;
/**
向该轨道加入视频
@param stream 视频
*/
- (void)addStream:(AliyunMixStream *)stream;
/**
开始合成
@return 返回值
*/
- (int)start;
/**
暂停合成
@return 返回值
*/
- (int)pause;
/**
恢复以继续合成
@return 返回值
*/
- (int)resume;
/**
取消合成
@return 返回值
*/
- (int)cancel;
AliyunMixComposer *mixComposer = [[AliyunMixComposer alloc] init];
mixComposer.outputPath = self.outputPath;
mixComposer.outputSize = CGSizeMake(720,720);
mixComposer.fps = 30;
mixComposer.bitrate = 10000000;
mixComposer.videoQuality = AliyunVideoQualityHight;
mixComposer.gop = 5;
mixComposer.delegate = (id)self;
AliyunMixTrack *recordTrack = [mixComposer createTrack:CGRectMake(0,0,360,720)];
NSString *videoPath = [videoAbsPaths objectAtIndex:idx];
AliyunMixStream *recordStream = [[AliyunMixStream alloc] init];
recordStream.filePath = videoPath;
recordStream.mode = AlivcContentModeScaleAspectFit;
[recordTrack addStream:recordStream];
AliyunMixTrack *playerTrack = [mixComposer createTrack:CGRectMake(360,0,360,720)];
AliyunMixStream *playerStream = [[AliyunMixStream alloc] init];
playerStream.filePath = mixVideoFilePath;
playerStream.mode = AlivcContentModeScaleAspectFit;
[playerTrack addStream:playerStream];
[mixComposer setOutputAudioReferenceTrack:playerTrack];
[mixComposer start];
在文档使用中是否遇到以下问题
更多建议
匿名提交