全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
视频点播

专业版

更新时间:2017-11-23 21:22:20

一、快速开始

1.1 系统版本

iOS支持iOS8.0及以上

1.2 开发环境配置

SDK开发环境建议macOS Sierra 10.12.2 XCode9.0及以上

1.3 导入SDK

直接引入SDK的framework,名称为 AliyunVideoSDKPro

  1. 开发者打开工程,选中目标target,依次选择”Build Phases”->”Link Binary With Libraries”,点击”+”号,点击“Add Other…”,导入AliyunOSSiOS.framework,VODUpload.framework,AliyunVideoCore.framework,AliyunVideoSDKPro.frameworkQuCore-ThirdParty.framework
  2. 开发者打开工程,选中目标target,依次选择”General”->”Embededed Binaries”,点击”+”号,点击“Add Other…”,导入AliyunVideoSDKPro.frameworkQuCore-ThirdParty.framework

  3. 同时,还需依赖libz.tbdImageIO.frameworkCoreMedia.frameworkCoreVideo.frameworkVideoToolBox.frameworkMediaPlayer.frameworkOpenAL.frameworklibc++.tbd,libsqlit3.tbd,libiconv.tbd请一并加上。截图如下:

依赖库示例

  1. 配置 Build Setting — Linking — Other Linker Flags 添加 -ObjC选项

1.4 添加用户权限

打开工程的 info.Plist 文件,添加如下字段

  1. `Privacy - Camera Usage Description`
  2. `Privacy - Microphone Usage Description`
  3. `Privacy - Photo Library Usage Description`

按需添加字段描述。

二、功能使用

2.1 录制模块

2.1.1 接口说明

阿里视频云短视频SDK提供视频录制层核心接口,详细定义如下:

头文件 功能说明
AliyunIRecorder.h 视频录制核心类,通过这个类可以管理摄像头画面裁剪、管理录制流程、录制界面的特效管理、录制流程中的相关回调以及对接三方人脸库进行人脸贴图的接口。
AliyunClipManager.h 视频录制片段管理类,实现视频录制时长管理、片段数量管理、片段文件管理等功能
AliyunFacePoint.h 人脸识别特征点管理类,通过人脸识别SDK识别出特征点后,此类提供相关的接口传入特征点,SDK内部进行人脸贴图渲染
AliyunEffectFilter.h 添加滤镜的类,通过加载滤镜文件即可实现实时滤镜
AliyunEffectImage.h 添加水印的类,通过加载水印文件即可实现实时水印,支持水印位置设置
AliyunEffectPaster.h 实现贴图的类,此类和编辑模块的贴图类是公用的,当前在录制时这个类仅用于人脸贴图
2.1.2 接口调用顺序

SDK3.0录制流程图

  • 初始化参数

    引入<AliyunVideoSDKPro/AliyunIRecorder.h>头文件。

    使用录制功能,需要初始化AliyunIRecorder对象,初始化方法如下:

    1. - (instancetype)initWithDelegate:(id)delegate videoSize:(CGSize)videoSize;

    参数说明,delegate传入代理对象,用于录制的回调信息,videoSize为设置的视频分辨率。

    AliyunIRecorder对象提供了preview属性,为用于播放视频的预览view,必需进行设置并确保preview的比例和videoSize的比例一致,即

    1. _recorder.preview = yourView;

    taskPath属性,必须设置,否则会导致无法输出文件,即

    1. _recorder.taskPath = yourTaskPath
  • 开始预览&结束预览

    开始预览如下方法:

    1. - (void)startPreviewWithPositon:(AliyunIRecorderCameraPosition)cameraPosition;
    2. - (void)startPreview;

    建议在ViewController- (void)viewWillAppear:(BOOL)animated时调用。

    结束预览如下方法:

    1. - (void)stopPreview;

    建议在ViewController- (void)viewDidDisappear:(BOOL)animated时调用。并且注意在进入其他界面时确保preview已经被stop掉,避免GL环境冲突。 启动拍摄拍摄界面,代码示例:

    1. //在录制界面的viewControllerd的viewDidLoad里面add一个拍摄预览视图
    2. UIView * preview = [[UIView alloc] init];
    3. //设置preview的大小,需要和viewSize保持一致比例,比如是9:16全屏拍摄可设置为
    4. preview.frame = CGRectMake(0,0,UIScreen.mainScreen.bounds.width,UIScreen.mainScreen.bounds.height);
    5. [self.view.addSubview preview];
    6. //创建一个AliyunIrecorder对象
    7. AliyunIrecorder * recorder = [[AliyunIrecorder alloc] initWithDelegate:self videoSize:CGSizeMake(540,960)];
    8. //设置recorder的preview
    9. recorder.preview = preview
    10. //在viewWillAppear里面调用开始预览的接口,需要指定摄像头请调用startPreviewWithPositon
    11. [record startPreview];
  • 开始录制&结束录制&完成录制

    在录制之前,确保已设置录制文件的输出路径,通过AliyunIRecorderoutputPath属性进行设置,注意该属性必须设置,否则会引起崩溃

    开始录制接口:

    1. - (void)startRecording;

    结束录制接口:

    1. - (void)stopRecording;

    完成录制接口:

    1. - (void)finishRecording;

    注:结束录制和完成录制的区别在于完成录制相当于录制流程的结束。这种场景可以出现在多段视频录制场景中,例如用户按下录制按钮,则开始录制,松开按钮,则结束录制,若不想再继续录制而想进入下一页,则调用完成录制。调用录制完成会把已经录制的多个片段合成为一个视频,如果用户用户使用我们的编辑模块,可以不用调用录制完成接口,编辑界面可以接受端端视频文件进行渲染,方便后期对多段视频再加工。 录制的代码示例:

    1. //设置输出路基
    2. recorder.outputPath = ‘自己设置录制完成后输出mp4的文件地址’
    3. recorder.taskPath = ‘自己设置存放中间文件、视频片段、配置文件的目录地址’
    4. //设置最小和最大录制时长,默认值为0.5和8秒
    5. recorder.clipManager.minDuration = 2;
    6. recorder.clipManager.maxDuration = 30;
    7. //在点击录制按钮里面实现开始录制
    8. [recorder startRecording];
    9. //在停止录制按钮里面实现停止录制
    10. [recorder stopRecording];
    11. //在录制的视频不需要经过编辑界面合成时,录制完成后调用finishRecording,这个接口会把录制的视频片段合成一个mp4输出到你设置的输出目录文件下面。如果需要对视频进行编辑的,建议不用掉此方法直接把当前的taskPath传给编辑界面。
    12. [recorder finishRecording];
    13. //在界面跳转前建议停止预览
    14. [recorder stopPreview];
  • 录制视频管理

    我们提供了视频录制片段的管理类—AliyunClipManager,该类可以对拍摄的视频进行设置,为AliyunIRecorder的属性,通过:

    1. _recorder.clipManager;

    获取。

    该类提供如下方法:

  1. @property (nonatomic, assign) CGFloat maxDuration; //视频最大时长 默认8
  2. @property (nonatomic, assign) CGFloat minDuration; //视频最小时长 默认0.5
  3. @property (nonatomic, assign, readonly) CGFloat duration;//视频总时长
  4. @property (nonatomic, assign, readonly) NSInteger partCount;//视频段数
  5. - (void)deleteAllPart;//删除所有视频片段
  6. - (void)deletePart;//删除最后一个视频片段
  7. - (void)deletePart:(NSInteger)index; //删除某一个视频段
  • 释放资源

    ViewController销毁时,我们也需要释放录制资源,在dealloc中调用:

    • (void)destroyRecorder;
  • 回调接口

    录制功能提供了一些回调函数:

    1. @required
    2. - (void)recorderDeviceAuthorization:(AliyunIRecorderDeviceAuthor)status;

    该接口开发必须调用,用来回调系统级别的权限,检测是否具有拍摄权限等。

    以下为非必需调用接口:

    1. - (void)recorderOutputVideoRawSampleBuffer:(CMSampleBufferRef)sampleBuffer;

    该接口回调视频的原始数据,开放这个接口的目的是让开发者可以使用摄像头数据来完成开发者自己的业务,主要场景是将数据传给第三方人脸识别SDK获取人脸识别后的特征点。如果第三方人脸识别SDK提供了人脸动图渲染能力,可以使用- (NSInteger)recorderOutputVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer textureName:(NSInteger)textureName;接收渲染后的纹理。此接口的业务场景为:使用第三方人脸识别SDK人脸贴图渲染并使用阿里云视频SDK提供的录制能力。注:如果使用这个接口就不需要使用我们SDK提供的人脸贴图相关的接口了

    1. - (void)recorderVideoDuration:(CGFloat)duration;

    录制实时时长

    1. - (void)recorderDidStopWithMaxDuration;

    录制到最大时长时的回调,可应用于录制到最大时长时直接跳转界面

    1. - (void)recorderDidStopRecording;

    停止录制回调

    1. - (void)recorderDidFinishRecording;

    录制结束的回调。

    1. - (void)recoderError:(NSError *)error;

    录制异常。

  • 实现人脸贴图的两种方式 实现人脸贴图功能都需要额外采购第三方人脸识别SDK。如果第三方人脸识别SDK仅提供特征点请使用方式一。如果第三方人脸SDK仅提供了动图渲染能力请使用方式二。如果第三方人脸SDK提供了特征点和渲染能力建议使用方式一,方式一的效率和性能会比较高。

    方式一:使用第三方人脸识别提供的关键点,通过-(void)faceTrack:(NSArray<AliyunFacePoint *> *)facePoints;这个接口传入人脸SDK识别的特征点,目前支持传入左眼中心点、右眼中心的和嘴巴中心点。然后再通过SDK提供的前置贴图方法AliyunEffectPaster设置人脸贴图。

    方式二:使用第三方人脸识别SDK提供的人脸贴图渲染能力,摄像头采集的数据通过- (void)recorderOutputVideoRawSampleBuffer:(CMSampleBufferRef)sampleBuffer这个代理给到人脸识别SDK,再通过人脸识别SDK贴完图将纹理通过- (NSInteger)recorderOutputVideoTextureName:(NSInteger)textureName textureSize:(CGSize)textureSie这个代理return给我们进行录制。这时不需要使用AliyunEffectPaster相关的接口,贴图素材也直接使用第三方提供的。

  • 其他接口

    • 滤镜、人脸贴图、水印

      录制过程中可以添加效果,这些效果目前包含滤镜,水印,人脸动图三种类型。效果的基类是AliyunEffect类。三种类型具体对应如下类:

      1. `AliyunEffectFilter`--滤镜
      2. `AliyunEffectPaster`--贴图
      3. `AliyunEffectImage` --静态图片(水印)

      添加效果的接口:

      1. - (void)addEffect:(AliyunEffect *)effect;

      移除效果的接口:

      1. - (void)deleteEffect:(AliyunEffect *)effect;

      添加水印代码示例:

      1. //创建水印对象
      2. AliyunEffectImage *waterMark = [[AliyunEffectImage alloc] initWithFile:‘设置水印图片文件路径’];
      3. //设置水印大小
      4. wartermark.frame = CGRectMake(10, 200, 50, 50)
      5. //应用水印效果,可在录制时实时添加水印,不需要实时水印的如有编辑功能也可以在编辑界面添加水印,两者取其一应用即可。
      6. [recorder applyImage:wartermark];

      添加滤镜代码示例:

      1. //创建滤镜对象
      2. AliyunEffectFilter *filter = [[AliyunEffectFilter alloc] initWithFile:‘设置滤镜目录地址’];
      3. //应用滤镜效果,可实时作用于录制画面。
      4. [recorder applyFilter:filter];

      录制配乐与调速代码示例:

      1. AliyunEffectMusic *effectMusic = [[AliyunEffectMusic alloc] initWithFile:`设置音乐路径`];
      2. effectMusic.startTime = 5; // 配乐开始时间点,从5秒开始
      3. effectMusic.duration = 15; // 配乐持续时长,持续15秒
      4. [_recorder applyMusic:effectMusic];
      5. [_recorder setRate:2]; // 两倍速

      配乐建议使用AAC编码格式。如果是MP3格式的音乐,会增加处理时间

      音乐设置需要在录制前,开始录制后禁止调用配乐接口

      录制速率大小在0.5~2之间,超过此区间无效

    • 可选接口

      1. 切换摄像头

        -(AliyunIRecorderCameraPosition)switchCameraPosition;

      2. 改变视频分辨率,改变视频分辨率的同时需改变preview的大小,需保持一致的比例。

        - (void)reStartPreviewWithVideoSize:(CGSize)videoSize;

      3. 照片模式下,循环切换闪光灯

        -(AliyunIRecorderFlashMode)switchFlashMode;

      4. 照片模式下,切换为指定闪光灯模式

        -(BOOL)switchFlashWithMode:(AliyunIRecorderFlashMode)flashMode;

      5. 视频模式下,循环切换手电筒模式

        (AliyunIRecorderTorchMode)switchTorchMode;

      6. 视频模式下,切换为指定手电筒模式

        -(BOOL)switchTorchWithMode:(AliyunIRecorderTorchMode)torchMode;

      7. 设置美颜开关

        -(void)setBeautifyStatus:(BOOL)beautifyStatus;

      8. 设置美颜度

        -(void)setBeautifyValue:(int)beautifyValue;

      9. 追踪识别的人脸点,这个接口应用于使用第三方人脸识别SDK提前特征点,然后用我们SDK提供的动图渲染能力进行渲染

        -(void)faceTrack:(NSArray<AliyunFacePoint *> *)facePoints;

      10. 设置摄像头采集数据格式

        1. /**
        2. 提供三种格式:
        3. kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,
        4. kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
        5. kCVPixelFormatType_32BGRA,
        6. 默认kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式
        7. */
        8. @property (nonatomic, assign) AliyunIRecorderVideoOutputPixelFormatType outputType;
        1. 获取framework版本号

          + (NSString *)version;

        12.设置录制速率

        - (void)setRate:(CGFloat)rate;

        13.静音

        @property (nonatomic, assign) BOOL mute;

        14.内置人脸识别

        1. /**
        2. 使用自带人脸识别,开启该功能,系统会在检测到有人脸动图加入时自动进行追踪显示
        3. */
        4. @property (nonatomic, assign) BOOL useFaceDetect;

        15.设置输出视频码率

        1. /** 码率 */
        2. @property (nonatomic, assign) int bitrate;
        3. /**

        16.人脸数量回调

        1. 人脸数量的回调,在useFaceDetect开启的状态下生效
        2. */
        3. @property (nonatomic, copy) void (^faceNumbersCallback)(int num);

2.2 裁剪模块

2.2.1 接口说明

阿里视频云短视频SDK提供视频裁剪核心接口,详细定义如下:

头文件 功能说明
AliyunCrop.h 视频和音乐裁剪核心类,通过这个类可以实现视频按时长裁剪、按画面裁剪,裁剪模式可选画面填充和裁切,并支持视频输出参数设置。
2.2.2 裁剪模块功能接口调用顺序图:

SDK3.0裁剪流程图

  • 初始化参数

    使用裁剪功能,需要初始化AliyunCrop对象,初始化方法如下:

    1. - (instancetype)initWithDelegate:(id<AliyunCropDelegate>)delegate;

    各实例变量说明:

    1. float startTime 截取时间起点 (单位:秒)
    2. float endTime 截取时间终点 (单位:秒)
    3. float fadeDuration 视频片段过渡动画时间 (单位:秒)
    4. AliyunCropCutMode cropMode 0 填充黑边 1 裁剪画面
    5. NSString *inputPath 视频或音乐资源路径
    6. NSString *outputPath 裁剪完成后的文件存放路径
    7. CGSize outputSize 裁剪后的视频尺寸
    8. int fps 帧率
    9. int gop 关键帧间隔
    10. AliyunVideoQuality videoQuality 视频质量
    11. CGRect rect 保留的视频尺寸 (cropMode 0 无效)
    12. UIColor *fillBackgroundColor 视频填充模式下,填充的背景颜色
    13. int bitrate 码率
    14. BOOL useHW 是否启用gpu裁剪

    关于裁剪范围rect中x,y,width,height值的计算:设定视频左上角为原点O(0,0),横向为x轴,纵向为y轴,假设视频裁剪区域为Z。rect中x值为Z区域的左上角顶点相对于原点O的x轴像素值,y值为Z区域的左上角顶点相对于原点O的y轴像素值。w为裁剪区域Z的宽度像素值,h为裁剪区域Z的高度像素值。

    关于裁剪音乐,无需设置rect,outputSize,gop等视频相关参数。

    裁剪视频代码示例:

    1. AliyunCrop * crop = [[AliyunCrop alloc] initWithDelegate:self];
    2. crop.inputPath = '需要裁剪的视频文件地址';
    3. crop.outputPath = '裁剪后输出的视频文件地址'
    4. crop.cropMode = AliyunCropModeScaleAspectCut;
    5. crop.outputSize = CGSizeMake(540, 540);//如输出的视频为540*540
    6. crop.rect = CGRectMake(0, 0, 320, 320);//这里可以认为你在当前视频上画了一个裁剪框(要保持视频画面不被裁剪需要设置宽为输入视频宽,高为输输入视频的高),裁剪框大小需和输出视频的分辨率的大小保持固定的比例关系。否定可能变形。
    7. crop.startTime = 0.0;
    8. crop.endTime = 5.0;
    9. crop.fillBackgroundColor = [UIColor greenColor];//填充模式下填充的背景颜色
    10. //开始裁剪
    11. [crop startCrop];

    裁剪音乐代码示例:

    1. liyunCrop * crop = [[AliyunCrop alloc] initWithDelegate:self];
    2. crop.inputPath = '需要裁剪的音乐文件地址';
    3. crop.outputPath = '裁剪后输出的音乐文件地址'
    4. crop.startTime = 0.0;
    5. crop.endTime = 5.0;
    6. //开始裁剪
    7. [crop startCrop];

    通过AliyunCropDelegate来监听裁剪完成、裁剪过程和裁剪错误。

    1. /**
    2. 裁剪失败时错误回调
    3. @param error 错误码
    4. */
    5. - (void)cropOnError:(int)error;
    6. /**
    7. 裁剪进度回调
    8. @param progress 当前进度
    9. */
    10. - (void)cropTaskOnProgress:(float)progress;
    11. /**
    12. 退出回调
    13. 主动取消或裁剪完成时回调
    14. */
    15. - (void)cropTaskOnComplete;
  • 开始裁剪

    1. - (int)startCrop;
    2. 返回值为0时表示配置正确
  • 取消裁剪

    1. - (void)cancel;
  • 版本号

    1. + (NSString *)version;
2.2.3 图片裁剪模块功能接口
  • 初始化参数使用裁剪功能,需要初始化AliyunImageCrop对象,调用alloc进行初始化。

各实例变量说明:

  1. /**
  2. 需要被裁剪的图片
  3. */
  4. @property (nonatomic, strong) UIImage *originImage;
  5. /**
  6. 裁剪后的图片大小
  7. */
  8. @property (nonatomic, assign) CGSize outputSize;
  9. /**
  10. 照片裁剪模式, 0:填充模式 1:裁剪模式
  11. */
  12. @property (nonatomic, assign) AliyunImageCropMode cropMode;
  13. /**
  14. 裁剪区域,仅适用于裁剪模式,例如一张图片(200x200像素 ,cropRect可设置为 (0,0,100,100)(单位为像素))
  15. */
  16. @property (nonatomic, assign) CGRect cropRect;
  17. /**
  18. 照片填充模式下,填充的背景颜色
  19. */
  20. @property (nonatomic, strong) UIColor *fillBackgroundColor;

裁剪出来的图片大小以像素为单位进行计算。

关于裁剪范围rect中x,y,width,height值的计算:设定视频左上角为原点O(0,0),横向为x轴,纵向为y轴,假设图片裁剪区域为Z。rect中x值为Z区域的左上角顶点相对于原点O的x轴像素值,y值为Z区域的左上角顶点相对于原点O的y轴像素值。w为裁剪区域Z的宽度像素值,h为裁剪区域Z的高度像素值。

  • 开始裁剪

    • (UIImage *)generateImage;

2.3 编辑模块

2.3.1 接口说明

阿里视频云短视频SDK提供视频编辑核心接口,详细定义如下:

头文件 功能说明
AliyunEditor.h 视频编辑核心类,编辑界面的播放器、各类特效(动图、MV、滤镜、音乐、水印)、视频的导出都通过此类来管理。
AliyunIPlayer.h 播放器控制类,实现播放控制相关的功能。
AliyunIPlayerCallback.h 播放器相关触发的回调类,包含开始、结束、播放进度、seek和异常状态的回调。
AliyunImporter.h 视频导入类,用来构建编辑界面需要json文件,目前是进入编辑界面前的必要条件。
AliyunEffect.h 各类特效(动图、MV、滤镜、音乐、水印)的基类、各类特效的初始化都是通过资源文件地址来创建的。
AliyunEffectFilter.h 添加滤镜的类,通过加载滤镜文件即可实现实时滤镜
AliyunEffectImage.h 添加水印的类,通过加载水印文件即可实现实时水印,支持水印位置设置
AliyunEffectPaster.h 实现贴图的类,此类和编辑模块的贴图类是公用的,当前在录制时这个类仅用于人脸贴图
AliyunEffectMusic.h 实现音乐效果类,通过此类添加音乐,静音、音量调节等功能通过编辑的edit来控制。
AliyunEffectPasterBase.h 动图和字幕的基类,主要用于实现动图的位置、大小、持续时间等方法。
AliyunEffectSubtitle.h 纯文字的类,这里面主要是配合AliyunPasterController来实现,如果直接文字渲染也可以将文字转换为图片,这是里面的属性就只需要使用到基类里面的位置和持续时间的属性了。
AliyunIExporter.h 视频合成导出的类,主要用于编辑界面视频导出,片尾水印也通过此类提供的方法来合成。
AliyunIExporterCallback.h 视频合成导出的回调了,用来监听导出视频时的各种状态。
AliyunIPasterRender.h 动图和字幕的直接渲染类,可以不使用AliyunPasterController来直接将动图、字幕合成到视频里面,主要用于UI和交互完全自定义的情况下实现动图和字幕功能。
AliyunPasterBaseView.h 动图的视图基类,里面提供的唯一方法是将视图转化为图片,主要用于直接渲染动图、字幕、涂鸦等功能。
AliyunPasterController.h 动图控制器,主要提供对动图的操控方法,demo中提供的动图移动、旋转、镜像、编辑等功能都是通过此类来实现的,主要用于在动图、字幕交互方面和我们demo一直的情况下使用。
AliyunPasterManager.h 动图管理类,主要提供对动图、字幕的添加、删除等方法,主要用于在动图、字幕交互方面和我们demo一直的情况下使用。
AliyunPasterUIEventProtocol.h 动图、字幕操作的回调方法,动图经过编辑后可以通过此类提供的方法监听,主要用于在动图、字幕交互方面和我们demo一直的情况下使用。
AliyunVideoParam.h 视频参数类,主要用户视频录制、导入、导出对视频相关参数的控制。
2.3.2编辑模块功能接口调用顺序图:

SDK3.0编辑接口调用流程

  • 生成配置文件编辑模块支持对一段或多段视频的编辑与导出。首先,需要生成包括视频片段路径和输出分辨率等信息的配置文件。这个工作由AliyunImporter提供。

初始化方法如下:

  1. - (instancetype)initWithPath:(NSString *)taskPath outputSize:(CGSize)outputSize;

注:taskPath是文件夹路径,由调用者提供给SDK使用。SDK将配置文件和视频片段等存放在taskPath文件夹中,SDK模块间通过taskPath传递视频相关信息。

我们可以通过如下方法添加一段或多段视频片段或者图片片段:

  1. /**
  2. 添加视频路径
  3. @param videoPath 视频路径
  4. @param animDuration 转场动画时长,单位秒
  5. duartion为当前视频片段和上段视频片段间的转场时长,不能小于视频本身时长
  6. 添加的第一段视频没有转场,duartion需要设为0
  7. */
  8. - (void)addVideoWithPath:(NSString *)videoPath animDuration:(CGFloat)animDuration;
  1. /**
  2. 添加视频路径并指定编辑视频开始点和结束点
  3. @param videoPath 视频路径
  4. @parma startTime 视频开始时间
  5. @parma duration 视频持续时间
  6. @param animDuration 转场动画时长,单位秒
  7. duartion为当前视频片段和上段视频片段间的转场时长,不能小于视频本身时长
  8. 添加的第一段视频没有转场,duartion需要设为0
  9. */
  10. - (void)addVideoWithPath:(NSString *)videoPath startTime:(CGFloat)startTime duration:(CGFloat)duration animDuration:(CGFloat)animDuration;
  1. /**
  2. 增加图片
  3. @param image 照片
  4. @param duration 播放时间
  5. @param animDuration 动画过渡时间
  6. @return 图片路径
  7. */
  8. - (NSString *)addImage:(UIImage *)image duration:(CGFloat)duration animDuration:(CGFloat)animDuration;

最后,调用如下方法生成配置文件:

  1. - (void)generateProjectConfigure;

这样,SDK会在taskPath文件夹中生成一个配置文件。编辑模块初始化时只需要传递taskPath路径,SDK内部会自动读取配置文件内容。导入代码示例:

  1. //创建导入对象
  2. AliyunImporter *importer = [[AliyunImporter alloc] initWithPath:‘用户设置的存放配置文件和视频片段的目录文件夹地址’ outputSize:‘用户设置的输出视频的分辨率’];
  3. //添加需要导入的视频,可以导入多个文件。转场效果仅支持淡入淡出效果,设置为0表示没有转场效果,每一个视频直接都可以设置转场时间。设置了转场效果后两个视频会叠加,叠加后视频总时长会减少。
  4. [importer addVideoWithPath:‘需要导入的视频文件地址’ animDuration0];
  5. //创建并设置视频参数,主要设置视频以裁剪模式还是填充模式进入编辑界面
  6. AliyunVideoParam * videoParam = [[AliyunVideoParam alloc] init];
  7. videoParam.scaleMode = AliyunCropCutModeScaleAspectFill;
  8. [importer setVideoParam:videoParam];
  9. //生成配置文件,生成配置文件后在edit的初始化使用
  10. [importer generateProjectConfigure];
  11. //导入后自己完成界面跳转
  • 初始化参数

    使用编辑功能,需要初始化AliyunIEditor对象,初始化方法如下:

    1. - (instancetype)initWithPath:(NSString *)taskPath size:(CGSize)outputSize preview:(UIView *)preview;

    参数说明: taskPath 文件夹路径 preview 编辑预览视图

  • 视频预览

    视频预览需要获取播放器,调用AliyunIEditor的如下接口获取一个播放器实例:

    1. /**
    2. 获取播放器接口实例
    3. @return AliyunIPlayer
    4. */
    5. - (id<AliyunIPlayer>)getPlayer;

    获取到一个AliyunIPlayer类的实例后,可以做如下操作

    开始播放

    1. - (void)play;

    seek接口

    1. -(void)seek:(float)time;

    暂停播放

    1. - (void)pause;

    继续播放

    1. - (void)resume;

    获取是否正在播放

    1. - (BOOL)isPlaying;

    重新开始播放

    1. - (void)replay;

    停止播放

    1. - (void)stop;

    获取总时长

    1. - (double)getDuration;

    获取当前播放时间

    1. - (double)getCurrentTime;

    播放器状态及生命周期图:

SDK3.0play_self_life播放器的使用示例:

  1. //创建播放器预览视图
  2. UIView * preview = [[UIView alloc] init];
  3. //设置preview的大小,需要和viewSize保持一致比例,比如是9:16全屏播放可设置为
  4. preview.frame = CGRectMake(0,0,UIScreen.mainScreen.bounds.width,UIScreen.mainScreen.bounds.height);
  5. [self.view.addSubview preview];
  6. //创建编辑器,viewWillAppear里面实现
  7. AliyunIEditor *edit = [[AliyunIEditor alloc] initWithPath:'录制/导入时设置的taskPath' size:‘输出视频的分辨率’ preview:preview];
  8. //设置编辑的代理,然后实现AliyunIPlayerCallback, AliyunIExporterCallback代理方法
  9. edit.delegate = self
  10. //获取播放器
  11. AliyunIPlayer *player = [edit getPlayer];
  12. //接下来根据自己的需求调用播放器的控制方法
  • 特效使用

    使用特效之前确保播放器已经就绪,处于onPrepared的状态。可以使用的特效主要有滤镜,贴纸,字幕,音乐,MV,水印。其中贴纸,字幕 有交互需求,sdk提供了两种使用方式。第一种方式是AliyunPasterManager来管理各类交互动作,在交互方式和我们demo类似的情况下使用。第二种方式是使用AliyunPasterRender来直接渲染字幕和贴纸,主要在UI和交互完全自定义的情况下使用。另外,除贴纸,字幕外的其他特效均使用AliyunIEditor接口添加。 滤镜,音乐,MV三种特效均使用特效类AliyunEffect,注:该类为Base基类,具体特效有对应得子类

滤镜,音乐,MV特效使用:

  1. /**
  2. 使用mv
  3. @param mv mv配置文件路径
  4. @return 错误码
  5. */
  6. - (int)applyMV:(AliyunEffectMV *)mv;
  7. /**
  8. 使用音乐
  9. @param music music配置文件路径
  10. @return 错误码
  11. */
  12. - (int)applyMusic:(AliyunEffectMusic *)music;
  13. /**
  14. 使用滤镜
  15. @param filter filter配置文件路径
  16. @return 错误码
  17. */
  18. - (int)applyFilter:(AliyunEffectFilter *)filter;

设置音量、混音权重:

  1. /**
  2. 设置是否静音
  3. @param mute 静音
  4. */
  5. - (void)setMute:(BOOL)mute;
  6. /**
  7. 设置音量
  8. @param volume 音量:0-200
  9. */
  10. - (void)setVolume:(int)volume;
  11. /**
  12. 设置混音权重
  13. @param weight 混音权重0-100
  14. */
  15. - (void)setAudioMixWeight:(int)weight;

注:一般在使用了音乐或MV后调用混音权重接口,如果没有音乐资源则调用该接口无效。

水印特效

  1. /**
  2. 添加视频水印
  3. @param imagePath 视频水印路径
  4. @param frame 水印frame
  5. */
  6. - (void)setWaterMark:(NSString *)imagePath frame:(CGRect)frame;

注:水印frame的宽高比需要与水印图片的真实宽高比相同。例如:一张100*200的图片在设置frame的时候需要width/height = 0.5;同时请用户确保imagePath真实存在水印图片示例:

  1. [self.editor setWaterMark:[UIImage imageNamed:@"watermark"] frame:CGRectMake(20, 20, 40, 40)];

渲染背景颜色

  1. /**
  2. 视频渲染最底层背景颜色 在填充模式下具有效果
  3. @param color 颜色
  4. */
  5. - (void)setRenderBackgroundColor:(UIColor *)color;

贴纸、字幕

贴纸和字幕拥有编辑可选项,如果添加贴纸后需要用户对贴纸进行大小,位置和显示时间的编辑,则可以使用AliyunPasterManager来添加贴纸特效,字幕亦然。

  • 调用AliyunIEditor的如下接口,获取AliyunPasterManager实例
  1. - (AliyunPasterManager *)getPasterManager;

AliyunPasterManager主要接口:

  • 设置编辑区域

@property (nonatomic, assign) CGSize displaySize; 注:编辑区域即视频播放区域大小,可设置为播放器视图大小

  • 添加动图
  1. /**
  2. 添加动图
  3. @param filePath 动图资源路径
  4. @param st 动图开始时间
  5. @param duration 动图持续时间
  6. @return 返回动图控制器
  7. */
  8. - (AliyunPasterController *)addPaster:(NSString *)filePath startTime:(double)st duration:(double)duration;
  • 添加字幕
  1. /**
  2. @param text 文字 如果为空 则会第一次会进入编辑 如果不为空 则直接显示 不会进入编辑状态
  3. @param bounds 大小
  4. @param st 字幕开始时间
  5. @param duration 字幕持续时间
  6. @return 返回动图控制器
  7. */
  8. - (AliyunPasterController *)addSubtitle:(NSString *)text bounds:(CGRect)bounds startTime:(CGFloat)st duration:(CGFloat)duration;
  • 删除动图控制器,在删除动图时调用
  1. /**
  2. 删除动图控制器,在删除动图时调用
  3. @param pasterController 需要删除的动图控制器
  4. @return YES:删除成功 NO:删除失败
  5. */
  6. - (BOOL)deletePasterController:(AliyunPasterController *)pasterController;
  • 获取所有的动图控制器
  1. /**
  2. 获取所有的动图控制器
  3. @return 动图控制器数组
  4. */
  5. - (NSArray *)getAllPasterControllers;
  • 通过id获取pasterController
  1. /**
  2. 通过id获取pasterController
  3. @param obj id
  4. @return pasterController
  5. */
  6. - (AliyunPasterController *)getPasterControllerByObj:(id)obj;
  • 动图上某个位置是否存在动图
  1. /**
  2. 动图上某个位置是否存在动图
  3. @param point 点击的位置
  4. @param time 当前视频播放的当前时间
  5. @return 若当前时刻该位置有动图,则返回动图控制器,否则,返回nil
  6. */
  7. - (AliyunPasterController *)touchPoint:(CGPoint)point atTime:(double)time;
  • 删除所有动图控制器,即删除所有动图
  1. - (void)removeAllPasterControllers;
  • 删除所有的普通动图
  1. - (void)removeAllNormalPasterControllers;
  • 删除所有的字幕动图
  1. - (void)removeAllCaptionPasterControllers;
  • 删除所有的纯文字动图
  1. - (void)removeAllSubtitlePasterControllers;
  • 获取当前正在编辑的动图控制器
  1. - (AliyunPasterController *)getCurrentEditPasterController;

获取AliyunPasterManager对象后,需要设置动图展示区域的大小,如果不设置,默认为以屏幕的宽作为边⻓的正方形区域,设置后才能正确的计算出贴纸在展示区域内正确的大小和位置。使用贴纸后会返回AliyunPasterController对象,AliyunPasterController定义了贴纸的位置,大小等相关信息,可以通过get方法获取,它也提供了贴纸编辑的一些接口,比如移除贴纸,设置贴纸时间,通知贴纸开始编辑及结束编辑。

AliyunPasterController主要接口如下:

  • 设置动图View,必须要设置

    1. @property (nonatomic, strong) UIView *pasterView;
  • 动图类型

    1. @property (nonatomic, assign, readonly) AliyunPasterEffectType pasterType;
  • 动图的旋转角度 单位:弧度

    1. @property (nonatomic, assign) CGFloat pasterRotate;
  • 动图的位置(x,y)

    1. @property (nonatomic, assign) CGPoint pasterPosition;
  • 动图的宽高

    1. @property (nonatomic, assign) CGSize pasterSize;
  • 动图的位置大小

    1. @property (nonatomic, assign) CGRect pasterFrame;
  • 动图镜像

    1. @property (nonatomic, assign) BOOL mirror;
  • 文字内容

    1. @property (nonatomic, copy) NSString *subtitle;
  • 文字位置 相对于动图本身的位置大小

    1. @property (nonatomic, assign, readonly) CGRect subtitleFrame;
  • 文字的后台配置字体

    1. @property (nonatomic, copy, readonly) NSString *subtitleConfigFontName;
  • 文字的后台配置字体的id

    1. @property (nonatomic, assign, readonly) NSInteger subtitleConfigFontId;
  • 文字是否描边

    1. @property (nonatomic, assign, readonly) BOOL subtitleStroke;
  • 文字颜色

    1. @property (nonatomic, strong) UIColor *subtitleColor;
  • 文字描边颜色

    1. @property (nonatomic, strong) UIColor *subtitleStrokeColor;
  • 文字字体

    1. @property (nonatomic, copy) NSString *subtitleFontName;
  • 关键帧图片

    1. @property (nonatomic, strong, readonly) UIImage *kernelImage;
  • 动图开始时间 单位:s

    1. @property (nonatomic, assign) CGFloat pasterStartTime;
  • 动图结束时间 单位:s

    1. @property (nonatomic, assign) CGFloat pasterEndTime;
  • 动图持续时间 单位:s

    1. @property (nonatomic, assign) CGFloat pasterDuration;
  • 编辑区域

    1. @property (nonatomic, assign) CGSize displaySize;
  • 关键帧图片
  1. - (NSString *)getKernelImagePath;
  • 唯一id
  1. - (int)eid;
  • 开始编辑 将要进入编辑状态
  1. - (void)editWillStart;
  • 开始编辑 进入编辑状态
  1. - (void)editDidStart;
  • 开始编辑 进入编辑
  1. - (void)editProcess;
  • 完成编辑
  1. - (void)editCompleted;
  • 字幕编辑完成
  1. - (void)editCompletedWithImage:(UIImage *)image;

通过AliyunPasterControllerDelegate可以监听动图状态如下:

  1. /**
  2. 移除动图控制器
  3. @param obj 动图控制器
  4. */
  5. - (void)onRemove:(id)obj;
  6. /**
  7. 动图控制器将要进入编辑
  8. @param obj 动图控制器
  9. */
  10. - (void)onEditWillBegin:(id)obj;
  11. /**
  12. 动图控制器进入编辑
  13. @param obj 动图控制器
  14. */
  15. - (void)onEditDidBegin:(id)obj;
  16. /**
  17. 动图控制器完成编辑
  18. @param obj 动图控制器
  19. */
  20. - (void)onEditEnd:(id)obj;
  21. /**
  22. 动图控制器完成编辑
  23. @param obj 动图控制器
  24. @param image 需要渲染的图片
  25. */
  26. - (void)onEditEnd:(id)obj image:(UIImage *)image;

AliyunPasterManager贴纸编辑添加MVC设计示意图:

SDK3.0贴图MVC 从上面的示意图中我们看到AliyunPasterManager负责创建AliyunPasterController对象,控制器中定义了AliyunPasterBaseView接口来获取上层UI的状态,用户交互对UI的修改会通过AliyunPasterBaseView反馈到控制层,控制层再同步UI状态到渲染层,从而完成了贴纸的编辑渲染,这样UI层可以自由定制,只要实现AliyunPasterViewUIEventProtocol即可。

  1. - (void)eventBoundsDidChanged:(CGRect)aBounds;
  2. - (void)eventCenterDidChanged:(CGPoint)aCenter;
  3. - (void)eventRotateDidChanged:(CGFloat)aRotate;
  4. - (void)eventTextBoundsDidChanged:(CGRect)aBounds;
  5. - (void)eventTextCenterDidChanged:(CGPoint)aCenter;
  6. - (void)eventMirrorChanged:(BOOL)isMirror;
  7. - (void)eventPasterViewClosed:(UIView *)pasterView;
  8. - (void)eventEditDidEnd;
  9. - (void)eventEditWillBegin;

用户直接调用底层AliyunPasterRender接口

用处除了可以使用前面的方式加贴图,前面的方式包含了我们一套默认UI,如果用户想完全采用自定义UI,也可以直接调用底层接口来实现。

调用AliyunIEditor的如下接口,获取AliyunPasterRender实例

  1. - (AliyunPasterRender *)getPasterRender;

提供接口主要如下:

  1. /**
  2. 底层接口,添加动图渲染
  3. @param paster 动图对象
  4. @return 是否成功
  5. */
  6. - (BOOL)addGifPaster:(AliyunEffectPaster *)paster;
  7. /**
  8. 底层接口,添加纯文字
  9. @param subtitle 纯文字动图对象
  10. @param textImage 文字截图
  11. */
  12. - (void)addSubtitlePaster:(AliyunEffectSubtitle *)subtitle textImage:(UIImage *)textImage;
  13. /**
  14. 底层接口,添加字幕动图
  15. @param caption 字幕动图对象
  16. @param textImage 文字截图
  17. */
  18. - (void)addCaptionPaster:(AliyunEffectCaption *)caption textImage:(UIImage *)textImage;
  19. /**
  20. 移除动图
  21. @param basePaster 动图对象
  22. */
  23. - (void)removePaster:(AliyunEffectPasterBase *)basePaster;
  24. /**
  25. 隐藏动图
  26. @param basePaster 动图对象
  27. */
  28. - (void)hidePaster:(AliyunEffectPasterBase *)basePaster;
  29. /**
  30. 显示普通动图
  31. @param paster 动图对象
  32. */
  33. - (void)showGifPaster:(AliyunEffectPaster *)paster;
  34. /**
  35. 显示纯文字动图
  36. @param subtitle 纯文字动图对象
  37. */
  38. - (void)showSubtitlePaster:(AliyunEffectSubtitle *)subtitle;
  39. /**
  40. 显示字幕动图
  41. @param caption 字幕动图对象
  42. */
  43. - (void)showCaptionPaster:(AliyunEffectCaption *)caption;

参数说明:AliyunEffectPasterAliyunEffectCaptionAliyunEffectSubtitle均继承自AliyunEffectPasterBaseAliyunEffectPasterBase的主要属性有:

  1. @property (nonatomic, assign) CGFloat startTime;//开始时间
  2. @property (nonatomic, assign) CGFloat endTime;//结束时间
  3. @property (nonatomic, assign) CGFloat minDuration;//最短时间
  4. @property (nonatomic, assign) CGFloat rotate;//旋转角度
  5. @property (nonatomic, assign) CGSize displaySize;//editzoneview
  6. @property (nonatomic, assign) CGRect frame;//位置大小
  7. @property (nonatomic, assign) CGPoint position;//位置
  8. @property (nonatomic, assign) CGSize size;//大小
  9. @property (nonatomic, assign) CGFloat width;
  10. @property (nonatomic, assign) CGFloat height;
  11. @property (nonatomic, assign) BOOL mirror;

说明:

startTime: 贴图开始的时间

endTime: 贴图结束的时间

minDuration: 贴图最小持续时间 一般从动图配置文件里面读取,如果设置的持续时间小于最小持续时间,会得不到想要的效果

rotate:动图的角度

displaySize:为编辑区域的大小,即播放视频的容器view的大小

frame:动图在编辑区域上的位置和大小

position: 动图在编辑区域上的中心点位置

size: 动图在编辑区域上的大小

width: 动图的宽

height: 动图的高

mirror: 是否镜像

用户在构建这个对象时,为了确定最后渲染时动图的位置大小,需要设置displaySize和动图自身的frame。

MV使用示例:

  1. //根据MV所在的目录创建MV对象
  2. AliyunEffectMV *mvEffect = [[AliyunEffectMV alloc] initWithFile:'MV文件目录地址'];
  3. //应用MV效果
  4. [edit applyMV:mvEffect];
  5. //建议应用MV后从头开始播放,MV是不支持Seek的
  6. [[edit getPlayer] replay];

音乐使用示例:

  1. //根据MP3文件创建音乐效果对象
  2. AliyunEffectMusic *music = [[AliyunEffectMusic alloc]initWithFile:'音乐文件的mp3地址'];
  3. //应用音乐效果
  4. [edit applyMusic:music];
  5. //对音乐和原音比例调整
  6. [edit setAudioMixWeight:50];
  7. //设置音量
  8. [edit setVolume:100];

滤镜使用示例:

  1. //创建滤镜对象
  2. AliyunEffectFilter *filter = [[AliyunEffectFilter alloc] initWithFile:‘设置滤镜目录地址’];
  3. //应用滤镜效果,可实时作用于录制画面。
  4. [edit applyFilter:filter];

动图使用示例:

  1. //使用动图资源文件目录创建动图对象
  2. AliyunEffectPaster *motionSticker = [[AliyunEffectPaster alloc] initWithFile:'动图所在的文件目录地址'];
  3. //设置动图的展示区域,展示区域设置为播放器的大小
  4. motionSticker.displaySize = playerView.bounds.size;
  5. //动图的位置,动图位置为动图中心点在播放器中的位置
  6. motionSticker.position = CGPointMake(160,200);
  7. //设置动图的大小,大小为在播放器中展示的大小,动图大小需要和动图提供的图片大小保存一致的比例,建议设置动图的默认大小为动图配置文件(json)中提供宽和高的一半
  8. motionSticker.size = CGSizeMake(141,53);
  9. //设置动图的开始时间,可以在视频的任意位置添加
  10. motionSticker.startTime = 0.0;
  11. //设置动图的结束时间,设置为全局动图时可将结束时间设置为视频时长
  12. motionSticker.endTime = [[edit getPlayer] getDuration];
  13. //添加动图,实时渲染到视频中去
  14. [[edit getPasterRender] addGifPaster:motionSticker];

字幕(纯文字)使用示例

  1. //纯文字对象可以不用任何参数直接创建
  2. AliyunEffectSubtitle *subtitle = [[AliyunEffectSubtitle alloc] init];
  3. //设置字幕的展示区域,展示区域设置为播放器的大小
  4. subtitle.displaySize = playerView.bounds.size;
  5. //字幕的位置,字幕位置为字幕中心点在播放器中的位置
  6. subtitle.position = CGPointMake(160, 280);
  7. //字幕的旋转角度,需要时使用,默认为水平(不设置时)
  8. subtitle.rotate = M_PI_4;
  9. //设置字幕的开始时间,可以在视频的任意位置添加,全局时设置为0
  10. subtitle.startTime = 0.0;
  11. //设置字幕的结束时间,设置为全局字幕时可将结束时间设置为视频时长
  12. subtitle.endTime = [[edit getPlayer] getDuration];
  13. //以下部分将文字转化为图片,然后将图片渲染到视频上
  14. AliyunPasterBaseView *pastBaseView = [[AliyunPasterBaseView alloc] init];
  15. pastBaseView.frame = CGRectMake(0, 0, UIScreen.mainScreen.bounds.width,50);//文字图片的大小
  16. UILabel *textLable = [[UILabel alloc] initWithframe: pastBaseView.bounds];
  17. textLable.text = "我是一个有趣的文字"
  18. textLable.textColor = [UIColor redColor];
  19. textLable.textAlignment = NSTextAlignmentCenter
  20. textLable.backgroundColor = [UIColor blackColor];
  21. textLable.font = [UIFont systemFontOfSize: 28];
  22. [pastBaseView addSubview:textLable];//在动图基类上添加我需要的文字
  23. UIImage *textImage = [pastBaseView captureImage];//使用动图基类生成一张图片
  24. //设置字幕大小,字幕大小可设置为生成图片的大小
  25. subtitle.size = pastBaseView.bounds.size;
  26. //添加字幕,实时渲染到视频中去
  27. [[edit getPasterRender] addSubtitlePaster:subtitle, textImage: textImage];

字幕动图(气泡)使用示例:

  1. //使用字幕动图所在的文件夹目录创建字幕动图对象
  2. AliyunEffectCaption *subtitleSticker = [[AliyunEffectCaption alloc] initWithFile: '动图字幕文件夹目录地址'];
  3. //设置字幕动图的展示区域,展示区域设置为播放器的大小
  4. subtitleSticker.displaySize = playerView.bounds.size;
  5. //字幕动图的位置,字幕动图位置为字幕动图中心点在播放器中的位置
  6. subtitleSticker.position = CGPointMake(160, 280);
  7. //设置字幕动图的开始时间,可以在视频的任意位置添加,全局时设置为0
  8. subtitle.startTime = 0.0;
  9. //设置字幕动图的结束时间,设置为全局字幕动图时可将结束时间设置为视频时长
  10. subtitle.endTime = [[edit getPlayer] getDuration];
  11. //创建动图基类,主要用于将文字生成图片
  12. AliyunPasterBaseView *pastBaseView = [[AliyunPasterBaseView alloc] init];
  13. //设置生成文字图片的位置大小,文字图片在气泡里面展示,隐藏不能超出气泡的大小,可以将文字图片设置为和气泡一样大小,可以将json文件提供的气泡宽、高除2来设置,如下
  14. pastBaseView.frame = CGRectMake(0, 0,375/2.0, 250/2.0);
  15. UILabel *textLable = [[UILabel alloc] initWithframe: pastBaseView.bounds];
  16. textLable.text = "我是一个有趣的文字"
  17. textLable.textColor = [UIColor redColor];
  18. textLable.textAlignment = NSTextAlignmentCenter;
  19. textLable.font = [UIFont systemFontOfSize: 18];
  20. [pastBaseView addSubview:textLable];//在动图基类上添加我需要的文字
  21. UIImage *textImage = [pastBaseView captureImage];//使用动图基类生成一张图片
  22. //设置字幕动图的大小,可以设置为json文件中宽高除以2作为字幕动图的大小
  23. subtitleSticker.size = CGSizeMake(375/2.0, 250/2.0);
  24. //设置字幕动图文字图片在气泡中的文字,根据自己的需求设置,但不要超过气泡的大小
  25. subtitleSticker.textFrame = pastBaseView.frame;
  26. //设置气泡里面的文字在气泡中的出现时间,比如先出现气泡后出现文字
  27. subtitleSticker.textRelativeToBeginTime = 0.5;
  28. //设置气泡里面的文字在气泡中结束时间,比如文字先结束,然后结束气泡。这里的气泡持续时间为2S(可以在字幕动图的json文件中获取),结束时间设置为1.5S
  29. subtitleSticker.textRelativeToEndTime = 1.5;
  30. //添加字幕动图,实时渲染到视频中去
  31. [[edit getPasterRender] addCaptionPaster:subtitleSticker, textImage: textImage];

涂鸦

SDK提供了涂鸦功能,用户可以根据自身业务选择此功能。涂鸦主要涉及有两个类:AliyunIPaintAliyunICanvasViewAliyunIPaint可以理解为画笔,AliyunICanvasView可以理解为画布。

画笔AliyunIPaint提供的方法有:

  1. /**
  2. 线条颜色
  3. */
  4. @property (nonatomic, strong) UIColor *lineColor;
  5. /**
  6. 线条宽度
  7. */
  8. @property (nonatomic, assign) CGFloat lineWidth;
  9. /**
  10. 线条阴影颜色
  11. */
  12. @property (nonatomic, strong) UIColor *shadowColor;
  13. /**
  14. 线条阴影宽度
  15. */
  16. @property (nonatomic, assign) CGFloat shadowWidth;
  17. /**
  18. init
  19. @param lineWidth 线条宽度
  20. @param lineColor 线条颜色
  21. @return self
  22. */
  23. - (instancetype)initWithLineWidth:(CGFloat)lineWidth
  24. lineColor:(UIColor *)lineColor;

画笔目前支持线条颜色、宽度、线条阴影颜色和阴影宽度的设置。

画布AliyunICanvasView主要提供:

  1. /**
  2. 回调
  3. */
  4. @property (nonatomic, weak) id<AliyunICanvasViewDelegate> delegate;
  5. /**
  6. 是否允许越界画图,默认不允许
  7. */
  8. @property (nonatomic, assign) BOOL enableCrossBorder;
  9. /**
  10. 画笔
  11. */
  12. @property (nonatomic, strong) AliyunIPaint *paint;
  13. /**
  14. init
  15. @param frame 画板frame
  16. @param paint 画笔
  17. @return self
  18. */
  19. - (instancetype)initWithFrame:(CGRect)frame
  20. paint:(AliyunIPaint *)paint;
  21. /**
  22. 更改画笔配置
  23. @param paint 画笔
  24. */
  25. - (void)changePaint:(AliyunIPaint *)paint;
  26. /**
  27. 清空所有线条(不可恢复)
  28. */
  29. - (void)remove;
  30. /**
  31. 撤销上一步
  32. */
  33. - (void)undo;
  34. /**
  35. 恢复上一步
  36. */
  37. - (void)redo;
  38. /**
  39. 完成
  40. @return 涂鸦图片
  41. */
  42. - (UIImage *)complete;

画布提供了基本的功能,如撤销、恢复、修改画笔配置等功能。

画笔和画布的使用示例代码如下:

  1. AliyunIPaint *paint = [[AliyunIPaint alloc] initWithLineWidth:SizeWidth(5.0) lineColor:[UIColor whiteColor]];
  2. self.paintView = [[AliyunICanvasView alloc] initWithFrame:rect paint:paint];
  3. self.paintView.delegate = self;
  4. self.paintView.backgroundColor = [UIColor clearColor];
  5. [self addSubview:self.paintView];

上面的示例代码中,paintView加入到你的目标view上,即可进行涂鸦。

涂鸦完成后,通过调用complete接口可以生成图片,生成的图片再通过AliyunEditorapplyPaint:接口即可渲染到视频上。

导出

通过AliyunIEditor的接口获取导出实例AliyunIExporter

  1. - (id<AliyunIExporter>)getExporter;

AliyunIExporter主要接口如下:

  1. /**
  2. 添加片尾水印
  3. @param image 水印图片
  4. */
  5. - (void)setTailWaterMark:(UIImage *)image frame:(CGRect)frame;
  6. /**
  7. 设置编码模式
  8. @param encodeMode 编码模式 0:软编 1:硬编
  9. */
  10. - (void)setEncodeMode:(int)encodeMode;
  11. /**
  12. 设置视频输出参数
  13. @param videoParam 视频输出参数
  14. */
  15. - (void)setVideoParam:(AliyunVideoParam *)videoParam;
  16. /**
  17. 开始导出视频
  18. @param outputPath 导出路径
  19. */
  20. - (void)startExport:(NSString *)outputPath;
  21. /**
  22. 取消导出视频
  23. */
  24. -(void)cancelExport;

导出视频使用示例:

  1. //获取导出对象
  2. AliyunIExporter * exporter = [edit getExporter];
  3. //设置导出视频的参数,这里的视频参数可以和导入的视频参数一致,导入的视频参数已经设置,这里也可以不用设置
  4. [exporter setVideoParam:videoParam];
  5. //片尾效果可以根据自己的需求来选择是否调用此方法
  6. [exporter setTailWaterMark:'水印图片UIImage类型',frame:CGRectMake(60, 150, 200,200)];
  7. //开始导出,可以监听导出的各种状态:开始导出、结束导出、取消导出、导出结束、导出进度和导出异常
  8. [exporter startExport:'输出后视频存放的文件地址'];

2.4 后台合成上传模块

2.4.1 接口说明

阿里视频云短视频SDK提供视频后台合成与上传接口,提升合成视频的用户体验,帮助客户端便捷的上传视频,详细定义如下:

头文件 功能说明
AliyunPublishManager.h 包含视频合成与上传两个功能。合成接口接收taskPath完成视频合成,上传接口上传已合成的视频。
2.4.2 调用顺序
  • 初始化参数

    使用上传合成功能,需要初始化AliyunPublishManager对象,并实现AliyunIExporterCallback和AliyunIUploadCallback代理方法:

    AliyunIExporterCallback为合成回调:

  1. /**
  2. 开始导出
  3. */
  4. - (void)exporterDidStart;
  5. /**
  6. 导出结束
  7. @param outputPath 输出文件路径
  8. */
  9. - (void)exporterDidEnd:(NSString *)outputPath;
  10. /**
  11. 导出取消
  12. */
  13. - (void)exporterDidCancel;
  14. /**
  15. 导出进度
  16. @param progress 0-1
  17. */
  18. - (void)exportProgress:(float)progress;
  19. /**
  20. 导出异常
  21. @param errorCode 错误码
  22. */
  23. - (void)exportError:(int)errorCode;

AliyunIUploadCallback为上传回调:

  1. /**
  2. 上传成功
  3. @param vid 视频vid
  4. @param imageUrl 图片路径
  5. */
  6. - (void)uploadSuccessWithVid:(NSString *)vid imageUrl:(NSString *)imageUrl;
  7. /**
  8. 上传失败
  9. @param code 错误码
  10. @param message 错误日志
  11. */
  12. - (void)uploadFailedWithCode:(NSString *)code message:(NSString *)message;
  13. /**
  14. 上传进度
  15. @param uploadedSize 已上传的文件大小
  16. @param totalSize 文件总大小
  17. */
  18. - (void)uploadProgressWithUploadedSize:(long long)uploadedSize totalSize:(long long)totalSize;
  19. /**
  20. token过期
  21. */
  22. - (void)uploadTokenExpired;
  23. /**
  24. 开始重试
  25. */
  26. - (void)uploadRetry;
  27. /**
  28. 重试完成,继续上传
  29. */
  30. - (void)uploadRetryResume;

各实例变量说明:

  1. outputPath 输出文件路径
  2. transcode 上传视频是否转码,默认为No
  3. maxRetryCount 上传失败最大重试次数,默认为2
  4. timeoutIntervalForRequest 上传失败重试间隔,默认为30

各方法说明:

  1. /**
  2. 设置片尾水印
  3. @param image 水印图片
  4. @param frame 水印位置
  5. @param duration 水印时长
  6. */
  7. - (void)setTailWaterMark:(UIImage *)image frame:(CGRect)frame duration:(CGFloat)duration;
  8. /**
  9. 合成视频
  10. @param taskPath taskPath
  11. @param outputPath 输出视频路径
  12. @return 接口调用是否成功
  13. */
  14. - (BOOL)exportWithTaskPath:(NSString *)taskPath outputPath:(NSString *)outputPath;
  15. /**
  16. 取消合成
  17. */
  18. - (void)cancelExport;
  19. /**
  20. 上传视频
  21. @param imagePath 视频缩略图
  22. @param svideoInfo 视频描述信息
  23. @param accessKeyId 服务端返回的临时accessKeyId
  24. @param accessKeySecret 服务端返回的临时accessKeySecret
  25. @param accessToken 服务端返回的临时accessToken
  26. @return 接口调用是否成功
  27. */
  28. - (BOOL)uploadWithImagePath:(NSString *)imagePath
  29. svideoInfo:(AliyunUploadSVideoInfo *)svideoInfo
  30. accessKeyId:(NSString *)accessKeyId
  31. accessKeySecret:(NSString *)accessKeySecret
  32. accessToken:(NSString *)accessToken;
  33. /**
  34. 刷新sts
  35. @param accessKeyId 服务端返回的临时accessKeyId
  36. @param accessKeySecret 服务端返回的临时accessKeySecret
  37. @param accessToken 服务端返回的临时accessKeySecret
  38. @param expireTime 服务端返回的过期时间
  39. */
  40. - (void)refreshWithAccessKeyId:(NSString *)accessKeyId
  41. accessKeySecret:(NSString *)accessKeySecret
  42. accessToken:(NSString *)accessToken
  43. expireTime:(NSString *)expireTime;
  44. /**
  45. 取消上传
  46. */
  47. - (void)cancelUpload;

合成视频

  1. 该接口允许视频后台合成,这里的后台并不是指用户按home键应用后台还能继续合成,而是是用户不需要在编辑页面等待合成。
  2. 合成接口接收taskPath作为输入参数,这个参数可以从编辑页面传入,也可以通过AliyunIImporter直接生成。
  3. 用户可以多次调用合成接口,但AliyunPublishManager只记录最后一次的outputPath
  4. 合成视频过程中不能再次调用合成接口。

上传视频

上传时序图:

上传时序图

  1. 上传接口需要用户提供STS Token和视频封面,STS Token一般是通过调用用户服务端接口获取。上图是上传时序图,详细流程可以参考上传SDK
  2. 视频路径不需要手动传入,sdk会自动上传上次合成的视频。
  3. 上传过程中无法再次调用上传接口。

2.5 开源View

SDK所有UI部分全部开源,用户可以最大限度的进行自定义UI。

SDK3.0开源UI组件图

AliyunPasterView:动图展示UIAliyunPasterTextInputView:动图键盘文字输入UIAliyunTabController:键盘弹起组件AliyunTimeline:编辑页上方导航条UI

三、常见问题

  1. iPhone4s开启人脸识别,进入录制页面会卡顿两秒,画面才动

    答:4S性能差,人脸识别耗性能

  2. iPhone4S开启人脸识别,录制动图视频,动图慢半拍

    答:4S性能差,人脸识别耗性能

  3. 视频支持哪些格式?

    答:目前只支持MP4、MOV。不支持3gp格式

  4. taskPath是什么?

    答:taskPath是文件夹路径,由调用者提供给SDK使用。SDK将配置文件和视频片段等存放在taskPath文件夹中,SDK模块间通过taskPath传递视频相关信息。

本文导读目录