全部产品
云市场

视频合拍

更新时间:2019-07-01 11:26:45

功能介绍

短视频SDK提供视频合拍功能,可支持多视频拼接合成,核心类AliyunMixRecorderAliyunMixComposer

版本差异

版本 功能描述
专业版 支持所有功能
标准版 支持所有功能
基础版 不支持

相关类功能

名称 功能
AliyunMixRecorder 合拍功能核心类,能快速实现合拍
AliyunMixComposer 合拍功能核心类,能对多段视频进行拼接合成

概念解释

在以下文档介绍中将提及一些特殊概念,为方便开发者理解,预先对概念做一些讲解。

1、合拍功能(AliyunMixRecorder):

视频合拍从产品功能层面看,就是两路视频(一路来自样本视频,一路来自设备摄像头采集),按照指定的布局模式(左右分屏,上下分屏,画中画等)进行合成,合成出来的视频每一帧画面将会同时包含两路视频的画面,而合拍视频的音频部分则采用样本视频的音频。以下为范例视图,实际上SDK内部支持开发者自己组织布局,关于如何布局将在后面讲述。track

2、轨道(AliyunMixTrack)

在概念1中提及的两路视频在SDK中被抽象为两个轨道:A轨道和B轨道,A轨放设备采集的视频,B轨放样本视频,用轨道抽象有利于开发者理解轨道布局的概念。

3、轨道布局(CGRect:trackDisplayFrame)

在iOS上,轨道创建时带有trackDisplayFrame位置属性。代表轨道在最终画面上占据的位置大小,其左上角为(0,0)原点,和系统的坐标系行为一致。如下示例图:layout

上图中:最终导出的分辨率为640×640,A轨道位置为(0,0,320,640),B轨道位置为(320,0,320,640),在轨道范围上可以加视频。示例代码见文档底部示例代码。

录制合拍(AliyunMixRecorder)

AliyunMixRecorder提供了快捷的录制和播放画面并存的能力。比如左边部分画面是摄像头采集,右边部分是播放视频。

初始化设置

  • 初始化创建AliyunMixRecorder对象,完成初始化。
  1. /**
  2. 初始化方法
  3. @param param 媒体信息
  4. @param outputSize 最终的合成分辨率
  5. @return 合拍对象
  6. */
  7. - (instancetype)initWithMediaInfo:(AliyunMixMediaInfoParam *)param outputSize:(CGSize)outputSize;

AliyunMixMediaInfoParam对象描述了合拍的窗口,摄像头窗口的位置大小,样本播放视频的位置大小。具体的解释如下:

  1. /**
  2. 合拍窗口View 必须设置
  3. */
  4. @property(nonatomic, strong) UIView *outputSizeView;
  5. /**
  6. 合拍样本视频的窗口大小
  7. 内部根据此frame在outputSizeView上展示样本播放窗口
  8. */
  9. @property(nonatomic, assign) CGRect mixVideoViewFrame;
  10. /**
  11. 合拍摄像头采集窗口的大小
  12. 内部根据此frame在outputSizeView上展示采集窗口
  13. */
  14. @property(nonatomic, assign) CGRect previewViewFrame;
  15. /**
  16. 合拍摄像头录制的视频分辨率
  17. */
  18. @property(nonatomic, assign) CGSize previewVideoSize;
  19. /**
  20. 参与合拍的视频路径
  21. */
  22. @property(nonatomic, copy) NSString *mixVideoFilePath;
  23. /**
  24. 参与合拍的视频开始时间
  25. */
  26. @property(nonatomic, assign) CGFloat streamStartTime;
  27. /**
  28. 参与合拍的视频结束时间
  29. */
  30. @property(nonatomic, assign) CGFloat streamEndTime;

AliyunMixRecorder类的其他接口和普通录制的接口类似。通过此接口实现的合拍流程和普通录制的流程也相似。

开启预览视图

  • 开启预览
  1. /**
  2. 开始预览
  3. @param cameraPosition 摄像头位置(前置、后置)
  4. */
  5. - (void)startPreviewWithPositon:(AliyunIRecorderCameraPosition)cameraPosition;
  6. /**
  7. 开始预览 默认前置摄像头
  8. */
  9. - (void)startPreview;
  • 停止预览
  1. - (void)stopPreview;
  • 销毁对象
  1. - (void)destroyRecorder;

录制视频

  • 开始录制一段视频
    1. - (int)startRecording;
  • 停止录制一段视频
    1. - (void)stopRecording;

startRecordingstopRecording需要成对出现。

其他参数设置

与录制模块的参数设置一致,具体可参阅视频录制文档

视频拼接(AliyunMixComposer)

AliyunMixComposer提供了对多个视频进行拼接的能力,属于底层实现类,能够实现多视频同画面效果,比如左右分屏、画中画、九宫格等效果。

AliyunMixStream:视频流

视频流是指具体用来合成拼接的视频,将加入到视频轨道中。

初始化及参数设置

  1. /**
  2. 合成的回调delegate
  3. */
  4. @property(nonatomic, weak) id<AlivcMixComposerDelegate> delegate;
  5. /**
  6. 视频最终导出分辨率 必须设置
  7. */
  8. @property(nonatomic, assign) CGSize outputSize;
  9. /**
  10. 视频最终导出路径 必须设置
  11. */
  12. @property(nonatomic, copy) NSString *outputPath;
  13. /**
  14. 码率 bps
  15. */
  16. @property(nonatomic, assign) NSInteger bitrate;
  17. /**
  18. 视频质量
  19. */
  20. @property(nonatomic, assign) AliyunVideoQuality videoQuality;
  21. /**
  22. 帧率,这里指的是平均帧率 默认:30
  23. */
  24. @property(nonatomic, assign) CGFloat fps;
  25. /**
  26. 关键帧间隔 默认:5
  27. */
  28. @property(nonatomic, assign) NSInteger gop;

创建视频轨道

  • 创建轨道
  1. /**
  2. 初始化合拍视频轨道
  3. @param trackDisplayFrame 该轨道的分辨率(参考坐标为视频导出分辨率,例如导出分辨率为960*960,trackDisplayFrame设置为(0,0,480,960)说明该轨道占据了左半部分区域)
  4. @return AlivcMixTrack对象
  5. */
  6. - (AliyunMixTrack *)createTrack:(CGRect)trackDisplayFrame;
  • 指定参考时长
  1. /**
  2. 指定以某个轨道的时长作为最终合成视频的时长
  3. @param referenceTrack 轨道
  4. */
  5. - (void)setOutputDurationReferenceTrack:(AliyunMixTrack *)referenceTrack;
  • 指定参考音轨
  1. /**
  2. 指定以某个轨道的音频作为最终合成视频的音频
  3. @param referenceTrack 轨道
  4. */
  5. - (void)setOutputAudioReferenceTrack:(AliyunMixTrack *)referenceTrack;

添加视频流

AliyunMixStream

AliyunMixStream对象解析:

  1. /**
  2. 视频文件路径
  3. */
  4. @property(nonatomic, copy) NSString *filePath;
  5. /**
  6. 可选参数
  7. 视频在所在轨道上展示的视频本身的裁剪范围,在裁剪模式下可用
  8. */
  9. @property(nonatomic, assign) CGRect innerCropFrame;
  10. /**
  11. 视频在轨道上播放的开始时间
  12. 单位:秒
  13. */
  14. @property(nonatomic, assign) CGFloat streamStartTime;
  15. /**
  16. 视频在轨道上播放的结束时间
  17. 单位:秒
  18. */
  19. @property(nonatomic, assign) CGFloat streamEndTime;
  20. /**
  21. 视频在轨道上的内容填充模式 分为填充模式和裁剪模式
  22. */
  23. @property(nonatomic, assign) AlivcContentMode mode;

添加视频流

  1. /**
  2. 向该轨道加入视频
  3. @param stream 视频
  4. */
  5. - (void)addStream:(AliyunMixStream *)stream;

合成、暂停、恢复和取消

  • 开始合成
  1. /**
  2. 开始合成
  3. @return 返回值
  4. */
  5. - (int)start;
  • 暂停合成
  1. /**
  2. 暂停合成
  3. @return 返回值
  4. */
  5. - (int)pause;
  • 恢复合成
  1. /**
  2. 恢复以继续合成
  3. @return 返回值
  4. */
  5. - (int)resume;
  • 取消合成
  1. /**
  2. 取消合成
  3. @return 返回值
  4. */
  5. - (int)cancel;

代码示例

  1. AliyunMixComposer *mixComposer = [[AliyunMixComposer alloc] init];
  2. mixComposer.outputPath = self.outputPath;
  3. mixComposer.outputSize = CGSizeMake(720,720);
  4. mixComposer.fps = 30;
  5. mixComposer.bitrate = 10000000;
  6. mixComposer.videoQuality = AliyunVideoQualityHight;
  7. mixComposer.gop = 5;
  8. mixComposer.delegate = (id)self;
  9. AliyunMixTrack *recordTrack = [mixComposer createTrack:CGRectMake(0,0,360,720)];
  10. NSString *videoPath = [videoAbsPaths objectAtIndex:idx];
  11. AliyunMixStream *recordStream = [[AliyunMixStream alloc] init];
  12. recordStream.filePath = videoPath;
  13. recordStream.mode = AlivcContentModeScaleAspectFit;
  14. [recordTrack addStream:recordStream];
  15. AliyunMixTrack *playerTrack = [mixComposer createTrack:CGRectMake(360,0,360,720)];
  16. AliyunMixStream *playerStream = [[AliyunMixStream alloc] init];
  17. playerStream.filePath = mixVideoFilePath;
  18. playerStream.mode = AlivcContentModeScaleAspectFit;
  19. [playerTrack addStream:playerStream];
  20. [mixComposer setOutputAudioReferenceTrack:playerTrack];
  21. [mixComposer start];