全部产品
云市场

视频录制

更新时间:2018-11-02 20:52:12

功能介绍

短视频SDK提供基础视频录制功能,支持添加配乐,变速录制,人脸贴纸等录制效果,核心类AliyunIRecorder

版本差异

版本 功能描述
专业版 支持所有功能
标准版 支持基础录制和音乐功能,不支持人脸识别
基础版 支持基础录制,不支持音乐和人脸识别

相关类功能

名称 功能
AliyunIRecorder 录制功能核心类
AliyunClipManager 录制片段管理器,获取片段信息,对视频片段进行删除操作等
AliyunIRecorderDelegate 录制代理回调

录制流程

录制功能需要获取摄像头和麦克风权限,否则无法录制。视频录制的流程如下:

录制时序图

初始化设置

  • 初始化

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

    videoSize表示输出视频的分辨率,分辨率不能是奇数,建议使用320x480,540x960,720x1280等。

  • 设置文件夹路径

    taskPath表示文件夹路径,用来存放录制相关配置。

    1. @property (nonatomic, copy) NSString *taskPath;
  • 设置录制视频输出路径

    1. @property (nonatomic, copy) NSString *outputPath;
  • 设置预览视图

    1. @property (nonatomic, strong) UIView *preview;

    preview长宽比和videoSize保持一致。

开启预览视图

  • 开始预览

    1. - (void)startPreview;
    2. - (void)startPreviewWithPositon:(AliyunIRecorderCameraPosition)cameraPosition;
  • 停止预览

    录制完成或退后台需要停止预览。

    1. - (void)stopPreview;
  • 销毁对象

    预览结束后销毁对象,释放录制相关资源。

    1. - (void)destroyRecorder;

录制参数设置

录制模块支持多种参数配置,需要注意的是,只能在预览视图时设置参数,录制过程中不能设置。

  • 设置曝光值

    1. @property (nonatomic, assign) CGFloat exposureValue;
  • 设置前置摄像头采集分辨率

    默认值:AVCaptureSessionPreset640x480,更多参数请从AVCaptureSession.h中获取。

    1. @property (nonatomic, copy) NSString *frontCaptureSessionPreset;
  • 设置后置摄像头采集分辨率

    默认值:AVCaptureSessionPreset1280x720,更多参数请从AVCaptureSession.h中获取。

    1. @property (nonatomic, copy) NSString *backCaptureSessionPreset;
  • 设置摄像头角度

    1. @property (nonatomic, assign) int cameraRotate;
  • 设置手动对焦点

    1. @property (nonatomic, assign) CGPoint focusPoint;
  • 设置变焦倍数

    每次调用videoZoomFactor接口,实际变焦值zoom为设定的1/100。例:设置videoZoomFactor = 10.0f,实际zoom += 0.1f。

    1. @property (nonatomic, assign) CGFloat videoZoomFactor;

    如果您开启前置摄像头录制,那么当前设置无效。

  • 设置编码方式

    1. /**
    2. 0软编 1硬编
    3. */
    4. @property (nonatomic, assign) int encodeMode;
  • 设置关键帧间隔

    默认值:5,建议设置值:1-300。

    1. @property (nonatomic, assign) int GOP;
  • 设置录制帧率

    默认值:25。

    1. @property (nonatomic, assign) int recordFps;
  • 设置是否静音

    1. @property (nonatomic, assign) BOOL mute;

    如果您在录制过程中添加音乐,那么当前设置无效。

  • 设置视频质量

    1. @property (nonatomic, assign) AliyunVideoQuality videoQuality;

    如果设置了bitrate参数,那么当前设置无效。

  • 设置输出视频码率(bps)

    1. @property (nonatomic, assign) int bitrate;
  • 设置采集视频格式

    SDK提供了三种视频格式:

    • kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

    • kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange

    • kCVPixelFormatType_32BGRA

    默认格式:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

    1. @property (nonatomic, assign) AliyunIRecorderVideoOutputPixelFormatType outputType;
  • 异步获取拍摄图片

    1. /**
    2. image 采集的渲染后图片
    3. rawImage 采集的原始图片
    4. */
    5. - (void)takePhoto:(void (^)(UIImage *image, UIImage *rawImage))handler;
  • 切换摄像头

    1. /**
    2. @return 切换后的摄像头位置
    3. */
    4. - (AliyunIRecorderCameraPosition)switchCameraPosition;
  • 循环切换手电筒模式手电筒模式有三种,分别是off,on和auto。切换顺序:off —-> on —-> auto。默认值:off。

    1. /**
    2. @return 切换后的手电筒模式
    3. */
    4. - (AliyunIRecorderTorchMode)switchTorchMode;
  • 切换指定手电筒模式

    1. /**
    2. @param torchMode 指定模式
    3. @return return YES if success
    4. */
    5. - (BOOL)switchTorchWithMode:(AliyunIRecorderTorchMode)torchMode;

录制特效设置

美颜

  • 设置是否开启美颜状态

    1. @property (nonatomic, assign) BOOL beautifyStatus;
  • 设置美颜度

    范围:[0,100]。

    1. @property (nonatomic, assign) int beautifyValue;

滤镜

短视频SDK的滤镜资源存放在滤镜文件夹,滤镜文件夹包含配置文件和相关资源。AliyunEffectFilter代表一个滤镜资源,可以通过初始化方法构造一个滤镜实例,参数path是滤镜资源文件夹路径。

  • 生成滤镜对象

    1. - (id)initWithFile:(NSString *)path;
  • 添加滤镜

    1. - (int)applyFilter:(AliyunEffectFilter *)filter;

    由于滤镜无法叠加,因此每次调用applyFilter:方法都会替换滤镜。

  • 删除滤镜

    1. - (void)deleteFilter;

特效

特效滤镜和滤镜都使用AliyunEffectFilter,但是两者用的资源不同。demo中提供了几组特效滤镜的资源文件,如抖动、幻影、科幻、朦胧、重影

  • 添加特效滤镜

    1. - (int)applyAnimationFilter:(AliyunEffectFilter *)filter;
  • 删除特效滤镜

    1. - (void)deleteAnimationFilter;

音乐特效

AliyunEffectMusic代表一个音乐资源,可以通过初始化方法构造一个音乐实例,参数path是音乐资源文件路径。

  • 生成音乐对象

    1. - (id)initWithFile:(NSString *)path;
  • 添加音乐

    1. - (int)applyMusic:(AliyunEffectMusic *)music;

    只能在录制开始前调用添加音乐接口,录制过程中或录制结束后不能调用该接口。

MV特效

短视频SDK的MV资源存放在MV文件夹中,MV文件夹包含了配置文件和相关资源。下载的MV压缩包中有四种长宽比的MV文件夹,用来适配不同的输出分辨率。AliyunEffectMV代表一个MV资源,可以通过初始化方法构造一个MV实例,参数path是MV资源文件夹路径。

  • 生成MV对象

    1. - (id)initWithFile:(NSString *)path;
  • 添加一个MV

    1. - (int)applyMV:(AliyunEffectMV *)mv;
  • 删除mv

    1. [recorder applyMV:nil]

贴纸/人脸识别特效

贴纸的基类是AliyunEffectPaster

  • 添加动图

    1. /**
    2. @param paster 动图
    3. */
    4. - (int)applyPaster:(AliyunEffectPaster *)paster;
  • 设置是否开启人脸识别

    开启该功能后,当系统检测有人脸动图加入时将自动追踪。

    1. @property (nonatomic, assign) BOOL useFaceDetect;
  • 设置人脸个数

    1. /**
    2. 最大设置3个,最小设置1个。如果不需要检测人脸,请使用:useFaceDetect = NO
    3. */
    4. @property (nonatomic, assign) int faceDetectCount;
  • 设置是否同步贴合人脸

    默认值:YES。同步贴合人脸的贴合性强,但是性能差的设备可能卡顿。非同步贴合人脸的画面流畅,但是贴合性差。

    1. @property (nonatomic, assign) BOOL faceDectectSync;

    建议iphoe6及以上机型设置为YES,iphoe6以下机型建议设置为NO。

  • 删除动图

    1. `- (void)deletePaster:(AliyunEffectPaster *)paster;`

水印特效

设置水印本质指加入一张图片进行渲染。

  • 设置动图、水印的位置

    1. /**
    2. @param rect 位置(x,y,width,height)均为比例值
    3. @param effect 指定的效果 (目前支持水印和普通动图)
    4. */
    5. - (void)setEffectView:(CGRect)rect effect:(AliyunEffect *)effect;

    rect表示位置(x,y,width,height),x,y,width和height的值都是比例值。例:播放视频view的size为(400,400),动图位置为(50,50,100,100),那么rect参数为(0.125,0.125,0.25,0.25);effect表示指定的效果(目前支持水印和普通动图)。

自定义渲染

SDK提供了多种渲染回调,包括音频的回调(用于音频渲染业务等),视频的回调(包括数据回调或纹理回调)。

  • 返回原始视频数据

    1. /**
    2. @param sampleBuffer 视频数据
    3. */
    4. - (void)recorderOutputVideoRawSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  • 返回原始音频数据

    1. /**
    2. @param sampleBuffer 音频数据
    3. */
    4. - (void)recorderOutputAudioRawSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  • 自定义渲染1

    1. /**
    2. @param sampleBuffer 原始数据
    3. @return 用户自渲染后的PixelBuffer
    4. */
    5. - (CVPixelBufferRef)customRenderedPixelBufferWithRawSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  • 自定义渲染2

    开放pixelBuffer和纹理id(仅支持BGRA格式)。

    1. /**
    2. @param pixelBuffer 摄像头数据
    3. @param textureName 摄像头数据纹理
    4. @return 自定义渲染后的纹理id
    5. */
    6. - (NSInteger)recorderOutputVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer textureName:(NSInteger)textureName;
  • 自定义渲染3

    1. /**
    2. @param srcTexture 原始视频帧纹理id
    3. @param size 原始视频帧纹理size
    4. @return 返回纹理id
    5. */
    6. - (int)customRender:(int)srcTexture size:(CGSize)size;
  • 自定义渲染4

    1. /**
    2. 摄像头数据格式为BGRA、YUV时都需实现
    3. @param textureName 原始纹理ID
    4. @return 处理后的纹理ID
    5. */
    6. - (NSInteger)recorderOutputVideoTextureName:(NSInteger)textureName textureSize:(CGSize)textureSie;
    1. /**
    2. 摄像头数据格式仅为YUV时须实现,反之不实现
    3. @param textureName 原始UV分量的纹理ID
    4. @return 处理后的纹理ID
    5. */
    6. - (NSInteger)recorderOutputVideoUVTextureName:(NSInteger)textureName;

录制视频

  • 开始录制一段视频

    SDK支持录制单段或多段,预览状态下,调用录制接口开始录制。

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

    1. - (void)stopRecording;
    • 调用stopRecording停止录制后,SDK内部会执行保存视频相关操作,收到AliyunIRecorderDelegate- (void)recorderDidStopRecording回调后才能继续执行其他操作。
    • startRecordingstopRecording需要成对出现,可以调用一次或多次,对应SDK内部会生成一段或多段临时视频文件。

完成录制

  • 完成录制

    1. - (void)finishRecording;
    • 收到AliyunIRecorderDelegate- (void)recorderDidFinishRecording回调后,录制操作完成,输出视频文件保存在outputPath中。

事件处理

对于锁屏,来电,退后台等事件,需要进行特殊处理。

页面需要监听UIApplicationWillResignActiveNotification事件,当进入Inactive状态前需要调用stopRecordingstopPreview方法停止预览。还需要监听UIApplicationDidBecomeActiveNotification事件,当进入Active状态后调用startPreview方法重新开启预览。

示例

  1. - (void)viewDidLoad {
  2. // 初始化配置recorder
  3. self.recorder = [[AliyunIRecorder alloc] initWithDelegate:self videoSize:CGSizeMake(720,1280)];
  4. self.recorder.preview = self.previewView;
  5. self.recorder.outputPath = `视频输出沙盒路径`;
  6. self.recorder.outputType = AliyunIRecorderVideoOutputPixelFormatType420f;//人脸识别只支持YUV格式
  7. self.recorder.taskPath = `taskPath路径`;
  8. // 录制片段设置
  9. self.clipManager = self.recorder.clipManager;
  10. self.clipManager.maxDuration = 15;
  11. self.clipManager.minDuration = 0.5;
  12. }
  13. - (void)recordButtonTouchesBegin {
  14. // 点击录制button开始录制
  15. [self.recorder startRecording];
  16. }
  17. - (void)recordButtonTouchesEnd {
  18. // 点击录制button停止录制
  19. [self.recorder stopRecording];
  20. }
  21. - (void)recorderDidStopRecording {
  22. // 收到录制停止回调,调用完成录制
  23. [self.recorder finishrecording]
  24. }
  25. - (void)recorderDidStopWithMaxDuration {
  26. // 收到录制达到最大时长回调,调用完成录制
  27. [self.recorder finishrecording]
  28. }
  29. - (void)recorderDidFinishRecording {
  30. // 收到完成录制回调,视频已经保存到初始化设置的`视频输出沙盒路径`路径下
  31. }