直播云

  • iOS 短视频 SDK

    最近更新时间:2018-09-04 14:43:20

    1 概述

    PLShortVideoKit 是七牛推出的一款适用于 iOS 平台的短视频 SDK,提供了包括美颜、滤镜、水印、断点录制、分段回删、视频编辑、混音特效、MV 特效、本地/云端存储在内的多种功能,支持高度定制以及二次开发。

    1.1 下载地址

    2 功能列表

    短视频 SDK 的功能,主要分为 4 大块:拍摄、编辑、转码、上传。

    2.1 视频拍摄

    功能点 版本 备注
    摄像头采集 1.0.0(+)
    麦克风采集 1.0.0(+)
    静音功能 1.0.0(+)
    实时美颜 1.0.0(+)
    贴纸特效 1.0.0(+) 需要额外付费
    大眼/瘦脸 1.0.0(+) 需要额外付费
    闪光灯开关 1.0.0(+)
    第三方美颜接口 1.0.0(+)
    第三方滤镜接口 1.0.0(+)
    自定义拍摄时长 1.0.0(+)
    自定义分辨率 1.0.0(+)
    自定义视频帧率 1.0.0(+)
    自定义视频码率 1.0.0(+)
    支持 1:1 正方形录制 1.0.0(+)
    断点拍摄(多段录制) 1.0.0(+)
    回删视频 1.0.0(+)
    H.264 硬编 1.0.0(+)
    AAC 硬编 1.0.0(+)
    输出 mp4 文件 1.0.0(+)
    支持 ARM7, ARM64 及模拟器 1.0.0(+)
    实时滤镜 1.0.0(+)
    实时水印 1.0.0(+)
    手动对焦 1.0.0(+)
    自动对焦 1.0.0(+)
    横屏拍摄 1.3.0(+)
    倍速拍摄 1.4.0(+)
    AR 特效拍摄 1.6.0(+) 需要额外付费
    录制背景音乐 1.7.0(+)
    视频草稿 1.7.0(+)
    拍摄时截图 1.9.0(+)
    分段特效 1.11.0(+)
    多视频合并 1.11.0(+)
    素材视频合拍 1.11.0(+)

    2.1.1 录屏

    功能点 版本
    外部导入音视频数据 1.2.0(+)

    2.2 视频编辑

    2.2.1 视频剪辑

    功能点 版本
    关键帧预览 1.0.2(+)
    剪辑指定区间 1.0.2(+)
    截取封面 1.0.2(+)
    视频分割 1.10.0(+)

    2.2.2 视频特效

    功能点 版本 备注
    滤镜 1.0.0(+)
    水印 1.0.0(+)
    贴纸特效 1.0.0(+) 基于面部识别,需要额外付费
    大眼/瘦脸 1.0.0(+) 基于面部识别,需要额外付费
    MV 特效 1.5.0(+)
    时光倒流特效 1.5.0(+)
    配音 1.6.0(+)
    变速 1.6.0(+)
    旋转 1.7.0(+)
    视频首帧作为滤镜封面图 1.7.0(+)
    文字特效 1.7.0(+)
    视频涂鸦 1.7.0(+)
    视频贴纸 1.7.0(+)
    抖音特效 1.9.0(+) 需要额外付费
    分段特效 1.11.0(+)

    2.2.3 音频特效

    功能点 版本
    音频混合 1.0.3(+)
    截取音频片段 1.0.3(+)
    调节原声/背景声音量 1.0.3(+)
    多重混音 1.11.0(+)

    2.2.4 视频合成

    功能点 版本
    制作 GIF 动图 1.3.0(+)
    多视频拼接 1.4.0(+)
    片头片尾 MV 拼接 1.4.0(+)
    图片合成视频 1.7.0(+)
    多视频合并 1.11.0(+)

    2.2.5 文字动画生成视频文件

    功能点 版本
    文字动画生成视频文件 1.10.0(+)

    2.3 视频转码

    功能点 版本
    画面剪裁 1.1.0(+)
    码率变换 1.1.0(+)

    2.4 视频上传

    功能点 版本
    上传云端 1.0.4(+)
    断点续传 1.1.0(+)

    3 阅读对象

    本文档为技术文档,需要阅读者:

    • 具有基本的 iOS 开发能力
    • 准备接入七牛云存储

    4 总体设计

    4.1 基本规则

    为了方便理解和使用,对于 SDK 的接口设计,我们遵循了如下的原则:

    • 每一个接口类,均以 PLS 开头
    • 简单的配置,通过 NSDictionary 来设置
    • 复杂的配置类,以 PLSXXXConfiguration 命名
    • 所有的回调代理,以 PLSXXXXDelegate 命名

    4.2 核心接口

    核心的接口类说明如下:

    接口类名 功能 备注
    PLShortVideoRecorder 负责视频的拍摄 音视频采集、美颜、编码、封包等
    PLShortVideoEditor 负责视频内容的编辑 添加滤镜、水印、文字特效等
    PLSAVAssetExportSession 负责视频的拼接、导出 视频导出等
    PLShortVideoTranscoder 负责视频的转码 视频转码,获取视频信息等
    PLShortVideoUploader 负责视频的上传 视频文件的上传
    PLSTransitionMaker 负责文字动画生成视频文件 文字转 mp4
    PLSMultiVideoMixer 负责将多个视频文件合并 多视频合并
    PLSVideoMixRecorder 负责素材视频合拍 视频编辑

    4.3 视频拍摄接口类

    拍摄功能相关的类说明如下:

    接口名 功能 备注
    PLShortVideoRecorder 视频拍摄的核心接口 核心接口
    PLSVideoConfiguration 配置摄像头参数 预览分辨率,前后摄像头等
    PLSAudioConfiguration 配置麦克风参数 通道,采样率等
    PLSFilter 内置滤镜对象 滤镜名称,缩略图等
    PLShortVideoRecorderDelegate 视频拍摄回调 包括原始数据回调及拍摄回调等

    4.4 视频编辑接口类

    4.4.1 视频内容编辑接口类

    视频编辑功能相关的类说明如下:

    接口名 功能 备注
    PLShortVideoEditor 视频编辑的核心接口 核心接口
    PLSEditSettings 配置视频编辑参数 源文件、音效、水印设置等
    PLSAVAssetExportSession 导出视频接口 根据设置的相应参数导出视频
    PLSGifComposer 制作 GIF 图接口 根据视频帧/图片数组合成 GIF图
    PLSMovieComposer 多个视频拼接接口 将多个视频拼接为1个视频
    PLSReverserEffect 时光倒流特效接口 将视频倒序

    4.4.2 视频转码接口类

    接口名 功能 备注
    PLSAVAssetExportSession 视频导出的核心接口 核心接口
    PLShortVideoTranscoder 视频转码的核心接口 核心接口

    4.5 视频上传接口类

    视频上传功能相关的类说明如下:

    接口名 功能 备注
    PLShortVideoUploader 视频上传的核心接口 核心接口
    PLSUploaderConfiguration 配置上传参数 超时时间,块大小等
    PLShortVideoUploaderDelegate 上传进度及结果回调 回调上传进度及结果

    5 开发准备

    5.1 设备以及系统要求

    • 设备要求:iPhone 5 及以上
    • 系统要求:iOS 8 及以上

    5.2 开发环境配置

    5.3 导入 SDK

    CocoaPods 是针对 Objective-C 的依赖管理工具,它能够将使用类似 PLShortVideoKit 的第三方库的安装过程变得非常简单和自动化,你能够用下面的命令来安装它:

    $ sudo gem install cocoapods
    

    Podfile

    为了使用 CoacoaPods 集成 PLShortVideoKit 到你的 Xcode 工程当中,你需要编写你的 Podfile

    target 'TargetName' do
    pod 'PLShortVideoKit'
    pod 'Qiniu'
    pod 'PLPlayerKit'
    end
    

    Warnings

    在使用了七牛的推流或连麦 SDK 的工程中,按照上面方式集成该短视频 SDK 会出现美颜库导致的符号冲突问题 duplicate symbol _OBJC_CLASS_ MuseProcessor,将pod 'PLShortVideoKit' 替换为 pod 'PLShortVideoKit/ex-libMuseProcessor' 即可解决

    target 'TargetName' do
    pod 'PLShortVideoKit/ex-libMuseProcessor'
    pod 'Qiniu'
    pod 'PLPlayerKit'
    end
    

    然后,运行如下的命令:

    $ pod install
    

    5.4 添加权限说明

    我们需要在 Info.plist 文件中添加相应权限的说明,否则程序在 iOS 10 系统上会出现崩溃。需要添加如下权限:

    • 麦克风权限:Privacy - Microphone Usage Description 是否允许 App 使用麦克风
    • 相机权限: Privacy - Camera Usage Description 是否允许 App 使用相机
    • 相册权限: Privacy - Photo Library Usage Description 是否允许 App 访问媒体资料库

    6 快速开始

    6.1 视频拍摄

    6.1.1 创建音视频的采集和编码配置对象

    当前使用默认配置,之后可以深入研究按照自己的需求作更改

    PLSVideoConfiguration *videoConfiguration = [PLSVideoConfiguration defaultConfiguration];
    PLSAudioConfiguration *audioConfiguration = [PLSAudioConfiguration defaultConfiguration];
    

    6.1.2 创建拍摄 recorder 对象

    self.shortVideoRecorder = [[PLShortVideoRecorder alloc] initWithVideoConfiguration:videoConfiguration audioConfiguration:audioConfiguration];
    
    

    6.1.3 添加摄像头预览视图

    将预览视图添加为当前视图的子视图

    [self.view addSubview:self.shortVideoRecorder.previewView];
    

    6.1.4 开始采集

    在开始录制前需要开启采集,开启采集后才能看到摄像头预览

    [self.shortVideoRecorder startCaptureSession];
    

    6.1.5 设置拍摄时长

    设置实际拍摄过程中的最大拍摄时长,最小拍摄时长

    // 单位为秒
    self.shortVideoRecorder.maxDuration = 60.0f;
    self.shortVideoRecorder.minDuration = 2.0f; 
    

    6.1.6 横屏拍摄

    设置是否根据设备的方向自动确定竖屏、横屏拍摄

    // 默认为 NO,不启用自动确定
    self.shortVideoRecorder.adaptationRecording = YES;
    

    注意:当 adaptationRecording 为 YES 时,可通过 deviceOrientationBlock 的回调,来获取设备方向,该属性初始化后修改无效

    6.1.7 监听前后台

    根据监听到 Application 的前后台状态自动停止和开始录制视频

    // 默认YES 从后台进入前台自动开始录制
    self.shortVideoRecorder.backgroundMonitorEnable = YES;
    

    **注意:该接口从1.11.0版本开始添加

    6.1.8 倍速拍摄

    设置拍摄的快/慢速率,支持5种拍摄速率 PLSVideoRecoderRateTopSlow、PLSVideoRecoderRateSlow、PLSVideoRecoderRateNormal、PLSVideoRecoderRateFast、PLSVideoRecoderRateTopFast

    // 默认为 PLSVideoRecoderRateNormal
    self.shortVideoRecorder.recoderRate = PLSVideoRecoderRateNormal;
    

    注意:录制的原始视频速率为Normal,调用PLSAVAssetExportSession合成后的视频才有倍速效果

    6.1.9 背景音乐

    设置拍摄时的背景音乐

    [self.shortVideoRecorder mixAudio:audioURL];
    

    在退出当前拍摄页面进入下一页面前,需要执行下面的代码段对拍摄的视频进行处理

    [self.shortVideoRecorder mixWithMusicVolume:0.3 videoVolume:0.8 completionHandler:^(AVMutableComposition * _Nullable composition, AVAudioMix * _Nullable audioMix, NSError * _Nullable error) {
    
    }];
    

    注意:需在completionHandler中使用AVAssetExportSession对原视频进行处理,否则无效,点击此处查看示例代码

    6.1.10 视频草稿

    加载视频草稿,即拍摄了一段视频保存到了草稿箱,在下次拍摄时,可以从草稿箱读取视频继续拍摄或编辑。

    [self.shortVideoRecorder insertVideo:draftVideoURL];
    

    6.1.11 截图

    在预览时,可以截取预览时的图像。

    [self.shortVideoRecorder getScreenShotWithCompletionHandler:^(UIImage * _Nullable image) {
    
    }
    

    6.1.12 开始拍摄

    录制的视频的存放地址由 SDK 内部自动生成

    [self.shortVideoRecorder startRecording];
    

    customFileURL 录制的视频的存放地址,该参数可以在外部设置,录制的视频会保存到该位置

    [self.shortVideoRecorder startRecording:customFileURL];
    

    6.1.13 停止拍摄

    [self.shortVideoRecorder stopRecording];
    

    6.1.14 停止采集

    [self.shortVideoRecorder stopCaptureSession];
    

    6.2 编辑预览

    编辑类 PLShortVideoEditor 支持渲染音视频、水印、滤镜、背景音乐、MV 特效等功能。

    6.2.1 视频数据回调

    通过 PLShortVideoEditor 的 Delegate 回调方法来处理播放时的视频数据,可以动态改变滤镜效果,pixelBuffer 格式为 kCVPixelFormatType_32BGRA

    - (CVPixelBufferRef)shortVideoEditor:(PLShortVideoEditor *)editor didGetOriginPixelBuffer:(CVPixelBufferRef)pixelBuffer;
    

    6.2.2 水印

    可以根据需要添加水印或移除水印,并且能够自由设置水印的大小和位置。

    • 添加水印
    - (void)setWaterMarkWithImage:(UIImage *)waterMarkImage position:(CGPoint)position;
    
    • 移除水印
    - (void)clearWaterMark;
    

    该方法用于移除已添加的水印

    6.2.3 滤镜

    • 添加、移除滤镜。
    /**
     *  @param colorImagePath 当前使用的滤镜的颜色表图的路径
     *  当 colorImagePath 为 nil 时,表示移除滤镜。
     */
    - (void)addFilter:(NSString *)colorImagePath;
    

    6.2.4 背景音乐

    • 添加背景音乐
    /**
     *  @param musicURL 当前使用的背景音乐的地址
     *  @param timeRange 当前使用的背景音乐的有效时间区域(start, duration)。
     *                   如果想使用整段音乐,可以将其设置为 kCMTimeRangeZero 
     *                   或者 (kCMTimeZero, duration)。
     *  @param volume 当前使用的背景音乐的音量
     */
    - (void)addMusic:(NSURL *)musicURL timeRange:(CMTimeRange)timeRange volume:(NSNumber *)volume;
    
    • 更新背景音乐
    /**
     *  @param timeRange 使用 kCMTimeRangeZero 时,表示不更新背景音乐的播放时间区域
     *  @param volume 使用 nil 时,表示不更新背景音乐的音量
     *  只更新 timeRange 时,[xxxObj updateMusic:timeRange volume:nil]
     *  只更新 volume    时,[xxxObj updateMusic:kCMTimeRangeZero volume:volume] 
     */
    - (void)updateMusic:(CMTimeRange)timeRange volume:(NSNumber *)volume;
    

    6.2.5 MV 特效

    • 添加、移除 MV 特效。
    /**
     *  @param colorURL 彩色层视频的地址
     *  @param alphaURL 被彩色层当作透明层的视频的地址
     *  目前支持添加一层 MV 图层。当 colorURL = nil 和 alphaURL = nil 时,表示移除 MV 图层。 
     */
    - (void)addMVLayerWithColor:(NSURL *)colorURL alpha:(NSURL *)alphaURL;
    

    6.2.5.1 MV 特效素材制作要求

    基本要求
    • 分辨率可用 480x480, 480x854,544x960等,决定合成视频的分辨率
    • 帧率建议使用 30帧/秒
    • 特效视频格式 .mp4。考虑跨平台以及视频体积,不建议使用 .mov
    • 特效视频的时长(单位:秒)决定合成视频的时长(单位:秒)
    对于部分区域为透明的 MV 特效视频,素材制作要求:
    • 配备1个黑白和1个彩色视频
    • 黑白视频中视频帧只有纯黑、纯白2种颜色。每一帧中纯黑像素点对应彩色视频的透明区域,纯白像素点对应彩色视频的非透明区域,视频格式为.mp4
    • 彩色视频,即视频特效期望的效果,透明区域用纯黑色表示,其它非透明区域可以使用包括纯黑色在内的任意颜色,视频格式为 .mp4
    • 黑白视频与彩色视频的帧率、分辨率必须相同
    • 黑白视频只带视频数据,无音频数据
    • 彩色视频在带有视频数据外,音频数据可有可无
    • 不建议使用 .mov 视频格式。缺点在于不利于跨平台编解码和播放处理,视频体积大

    6.2.6 时光倒流特效

    PLSReverserEffect 支持时光倒流特效。

    • 初始化 PLSReverserEffect 时光倒流对象
    - (instancetype)initWithAsset:(AVAsset *)asset;
    
    • 执行时光倒流
    - (void)startReversing;
    
    • 取消时光倒流
    - (void)cancelReversing;
    
    • 时光倒流完成的 Block
    @property (copy, nonatomic) void(^completionBlock)(NSURL *url);
    
    • 时光倒流失败的 Block
    @property (copy, nonatomic) void(^failureBlock)(NSError *error);
    
    • 时光倒流进度的 Block

    可在该 Block 中刷新时光倒流进度条 UI。

    @property (copy, nonatomic) void(^processingBlock)(float progress);
    

    6.2.7 倍速特效

    PLShortVideoAsset 支持倍速特效。

    6.2.8 视频旋转

    调用编辑类 PLShortVideoEditor的如下接口,可在编辑时预览旋转效果

    - (PLSPreviewOrientation)rotateVideoLayer;
    
    - (void)resetVideoLayerOrientation;
    

    6.2.9 文字特效、视频贴纸、视频涂鸦

    PLSVideoEditingView 支持文字特效、视频贴纸、视频涂鸦效果。

    6.3 视频合成

    PLSAVAssetExportSession 支持视频合成功能,支持纯音频合成。

    6.3.1 初始化视频合成对象

    self.exportSession = [[PLSAVAssetExportSession alloc] initWithAsset:asset];
    

    6.3.2 设置视频合成参数

    6.3.2.1 水印

    PLSAVAssetExportSession 支持视频合成时添加水印功能,你可以根据自己的需要添加水印或移除水印,并且能够自由设置水印的大小和位置。

    视频合成时水印设置:

    NSMutableDictionary *waterMarkSettings = [[NSMutableDictionary alloc] init];
    waterMarkSettings[PLSURLKey] = self.watermarkURL;
    waterMarkSettings[PLSSizeKey] = [NSValue valueWithCGSize:self.watermarkSize];
    waterMarkSettings[PLSPointKey] = [NSValue valueWithCGPoint:self.watermarkPosition];
    outputSettings[PLSWatermarkSettingsKey] = waterMarkSettings;
    

    6.3.2.2 背景音乐

    PLSAVAssetExportSession 支持视频合成时添加背景音乐功能,并支持截取音乐中的片段加入到源视频素材中。

    视频合成时背景音乐设置:

    self.audioSettings[PLSURLKey] = musicUrl;
    self.audioSettings[PLSStartTimeKey] = [NSNumber numberWithFloat:startTime];
    self.audioSettings[PLSDurationKey] = [NSNumber numberWithFloat:duration];
    self.audioSettings[PLSNameKey] = musicName;
    outputSettings[PLSAudioSettingsKey] = self.audioSettings;
    

    6.3.2.3 设置合成参数

    self.exportSession.outputSettings = outputSettings;
    

    6.3.3 启动视频合成

    [self.exportSession exportAsynchronously];
    

    6.3.4 合成回调

    通过反馈 PLSAVAssetExportSession 的 Delegate 或 Block 回调来反馈合成的状态。

    • 输出合成视频文件的视频数据,用来做滤镜处理
    - (CVPixelBufferRef __nonnull)assetExportSession:(PLSAVAssetExportSession *__nonnull)assetExportSession didOutputPixelBuffer:(CVPixelBufferRef __nonnull)pixelBuffer;
    
    • 输出合成视频文件的进度的 Block 回调,progress从 0 到 1
    @property (copy, nonatomic) void(^ _Nullable processingBlock)(float progress);
    
    • 合成视频完成的 Block 回调
    @property (copy, nonatomic) void(^ _Nullable completionBlock)(NSURL * _Nullable url);
    
    • 合成视频失败的 Block 回调
    @property (copy, nonatomic) void(^ _Nullable failureBlock)(NSError* _Nullable error);
    

    6.4 视频转码

    PLShortVideoTranscoder 支持视频本地转码和视频裁剪,减少视频体积。

    6.4.1 初始化转码对象

    self.shortVideoTranscoder = [[PLShortVideoTranscoder alloc] initWithURL:self.url];
    

    转码时旋转视频画面,支持正立、左旋、倒立、右旋。

    self.shortVideoTranscoder.rotateOrientation = self.rotateOrientation;
    

    6.4.2 启动转码

    [self.shortVideoTranscoder startTranscoding];
    

    6.4.3 取消转码

    [self.shortVideoTranscoder cancelTranscoding];
    

    6.4.4 转码回调

    • 转码完成的 Block 回调
    @property (copy, nonatomic) void(^completionBlock)(NSURL *url);
    
    • 转码失败的 Block 回调
    @property (copy, nonatomic) void(^failureBlock)(NSError* error);
    
    • 反馈转码进度的 Block
    @property (copy, nonatomic) void(^processingBlock)(float progress);
    

    6.5 视频帧/图片生成 GIF 动图

    从 v1.3.0 开始,PLSGifComposer 支持选取视频帧/图片数组生成 GIF 动图。该功能使得 SDK 可以满足自主设计 GIF 的应用场景,需要使用该功能时,通过以下接口

    - (instancetype)initWithImagesArray:(NSArray *)imagesArray;
    

    来初始化 PLSGifComposer 对象,并为参数 composerArray 传入视频帧/图片数组即可。

    6.5.1 设置 GIF 帧间隔

    // Gif 动图每帧间隔设置,默认 0.1f
    @property (assign, nonatomic) CGFloat interval;
    

    6.5.2 生成 GIF 图

    通过以下接口

    - (void)composeGif;
    

    6.5.3 取消生成 GIF 图

    - (void)cancelComposeGif;
    

    来生成 GIF 图,合成结果的回调见 completionBlockfailureBlock

    6.5.4 展示 GIF 图

    通过以下接口

    - (void)loadGifWithFrame:(CGRect)frame superView:(UIView *)superView repeatCount:(NSInteger)repeatCount;
    

    来展示 GIF 图,传入要展示的 GIF 图的 frame,superView 要加载的父视图以及 repeatCount 重复次数。

    6.6 多个视频拼接

    从 v1.4.0 开始,PLSMovieComposer 支持拼接多个视频为1个视频,不支持纯音频拼接。

    6.6.1 初始化视频拼接对象

    初始化视频拼接对象的方式有以下2种

    self.movieComposer = [[PLSMovieComposer alloc] initWithUrls:self.urls];
    
    self.movieComposer = [[PLSMovieComposer alloc] initWithAssets:self.assets];
    

    设置拼接后的视频的分辨率

    self.movieComposer.videoSize = CGSizeMake(480, 854);
    

    6.6.2 设置视频拼接的 Block 回调

    拼接成功的 Block 回调

    [self.movieComposer setCompletionBlock:^(NSURL *url) {
        NSLog(@"movieComposer ur: %@", url);
    }];
    

    拼接失败的 Block 回调

    [self.movieComposer setFailureBlock:^(NSError *error) {
        NSLog(@"movieComposer failed");
    }];
    

    拼接进度的 Block 回调

    [self.movieComposer setProcessingBlock:^(float progress){
        NSLog(@"movieComposer progress: %f", progress);
    }];
    

    6.6.3 启动视频拼接

    [self.movieComposer startComposing];
    

    6.6.4 停止视频拼接

    在拼接视频过程中,若想停止该操作,可调用如下方法

    [self.movieComposer stopComposing];
    

    6.7 图片合成视频

    PLSImageToMovieComposer 支持多张图片合成视频。

    6.8 多视频合并

    PLSMultiVideoMixer 支持将多个视频合并为一个视频。支持设置每一个视频的位置、大小、开始播放时间等。

    6.8.1 初始化多视频合并对象

    PLSMultiVideoMixer *multiVideoMixer = [[PLSMultiVideoMixer alloc] init];
    multiVideoMixer.videoSize = CGSizeMake{720, 640};
    

    6.8.2 添加视频对象

    PLSMixMediaItem *mediaItem1 = [[PLSMixMediaItem alloc] init];
    mediaItem1.mediaURL = [NSURL fileURLWithPath:@"a video file path"];
    mediaItem1.VideoFrame = CGRectMake{0, 0, 360, 640};
    
    PLSMixMediaItem *mediaItem2 = [[PLSMixMediaItem alloc] init];
    mediaItem2.mediaURL = [NSURL fileURLWithPath:@"a video file path"];
    mediaItem2.VideoFrame = CGRectMake{360, 0, 360, 640};
    
    [multiVideoMixer addMedia:mediaItem1];
    [multiVideoMixer addMedia:mediaItem2];
    

    6.8.3 视频合并实时效果预览

    PLSMultiVideoMixer 添加视频对象之后,可以获取 AVPlayerItem 实例,使用 AVPlayer播放预览

    AVPlayerItem *playerItem = [multiVideoMixer getPlayerItem];
    

    6.8.4 导出合并视频

    [multiVideoMixer startExport];
    

    6.8.5 导出视频的block回调

    导出合并视频成功的 block 回调

    [mulitVideoMixer setCompletionBlock:^(NSURL * _Nonnull url) {
    
     }];
    

    导出合并视频失败的 block 回调

    [mulitVideoMixer setFailureBlock:^(NSError * _Nonnull error) { 
    
    }];
    

    导出合并视频进度的 block 回调

    [mulitVideoMixer setProcessingBlock:^(float progress) {
    
    }];
    

    6.9 素材视频合拍

    PLSVideoMixRecorder 支持和一个素材视频合拍为一个视频。相机采集视频和素材视频在合并视频中的位置可以自由定义,支持素材音频和麦克风采集音频混音。该类的接口和 PLShortVideoRecorder 的接口很相似,可以参考 PLShortVideoRecorder 来使用素材视频合并。

    6.9.1 创建合拍音视频的采集和编码配置对象

    当前使用默认配置,之后可以深入研究按照自己的需求作更改

    PLSVideoMixConfiguration *videoConfiguration = [PLSVideoMixConfiguration defaultConfiguration];
    PLSAudioMixConfiguration *audioConfiguration = [PLSAudioMixConfiguration defaultConfiguration];
    

    6.9.2 创建拍摄 recorder 对象

    PLSVideoMixRecorder *videoMixRecorder = [[PLSVideoMixRecorder alloc] initWithVideoConfiguration:videoConfiguration audioConfiguration:audioConfiguration];
    videoMixRecorder.mergeVideoURL = [NSURL fileURLWithPath:@"a file path"];
    

    6.9.3 添加合拍视频数据预览视图

    [self.view addSubview: videoMixRecorder.previewView];
    

    6.9.4 打开合拍视频预览

    [videoMixRecorder startCaptureSession];
    

    6.9.5 开始拍摄

    合拍开始后,如果素材视频有音频流,将会进行素材音频的播放。素材音频的播放会影响到麦克风的音频采集,虽然麦克风采集可以选择回音消除,但是效果肯定比不上戴耳机好,建议如果要进行音频合并,带上耳机进行合拍

    [videoMixRecorder startRecording];
    

    或者使用

    [videoMixRecorder startRecording:customFileURL];
    

    6.9.6 停止合拍

    [videoMixRecorder stopRecording];
    

    6.9.7 停止预览

    [self.shortVideoRecorder stopCaptureSession];
    

    6.10 视频上传

    PLShortVideoUploader 支持视频上传到云端,接口灵活。

    6.10.1 配置上传参数

    客户端在上传前,需要先从服务端获取上传凭证,即 token

    PLSUploaderConfiguration * uploadConfig = [[PLSUploaderConfiguration alloc] initWithToken:kUploadToken videoKey:key https:YES recorder:nil];
    
    

    6.10.2 创建上传对象

    self.shortVideoUploader = [[PLShortVideoUploader alloc] initWithConfiguration:uploadConfig];
    

    6.10.3 上传视频

    [self.shortVideoUploader uploadVideoFile:filePath];
    

    6.10.4 取消上传

    [self.shortVideoUploader cancelUploadVidoFile];
    

    6.10.5 上传回调

    通过 PLShortVideoUploader 的 Delegate 回调方法来反馈视频上传的状态。

    • 上传进度回调
    - (void)shortVideoUploader:(PLShortVideoUploader * _Nonnull)uploader uploadKey:(NSString * _Nullable)uploadKey uploadPercent:(float)uploadPercent;
    
    • 上传结果回调
    - (void)shortVideoUploader:(PLShortVideoUploader * _Nonnull)uploader completeInfo:(PLSUploaderResponseInfo * _Nonnull)info uploadKey:(NSString * _Nonnull)uploadKey resp:(NSDictionary * _Nullable)resp;
    

    7 功能使用

    当你要深入理解 SDK 的一些参数及有定制化需求时,可以从高级功能部分中查询阅读,以下小节无前后依赖。

    7.1 音视频采集和编码配置

    PLShortVideoRecorder 中通过不同的 configuration 设置不同的采集或编码配置信息,对应的有:

    • PLSVideoConfiguration 视频采集、编码配置
    • PLSAudioConfiguration 音频采集、编码配置

    可以通过如下途径来设置 configuration:

    • PLShortVideoRecorder init 时传递对应的 configuration
    • 在拍摄前、拍摄结束后调用下面的方法重置视频采集、编码配置

    - (void)reloadvideoConfiguration:(PLSVideoConfiguration *__nonnull)videoConfiguration;

    • 对于视频采集配置,可以直接设置 PLShortVideoRecorder 相关的属性;

    需要注意的是,通过 reload 方法重置 configuration 时,需要确保传递的 configuration 与当前 session 已经持有的不是一个对象。

    7.1.1 视频采集参数

    当前的 PLSVideoConfiguration 中可自行设定的参数有

    • videoFrameRate
      • 即 FPS,每一秒所包含的视频帧数
    • sessionPreset
      • 即采集时的画幅分辨率大小
    • previewMirrorFrontFacing
      • 是否在使用前置摄像头采集的时候镜像预览画面
    • previewMirrorRearFacing
      • 是否在使用后置摄像头采集的时候镜像预览画面
    • streamMirrorFrontFacing
      • 是否在使用前置摄像头采集的时候镜像编码画面
    • streamMirrorRearFacing
      • 是否在使用后置摄像头采集的时候镜像编码画面
    • position
      • 开启 PLShortVideoSession 的时候默认使用前置还是后置摄像头
    • videoOrientation
      • 开启 PLShortVideoSession 的时候默认使用哪个旋转方向

    需要注意的是指定分辨率的 sessionPreset 例如 AVCaptureSessionPreset1920x1080 并非所有机型的所有摄像头均支持,在设置相应的采集分辨率之前请务必保证做过充分的机型适配测试,避免在某些机型使用该机型摄像头不支持的 sessionPreset。另外,如果使用只指定采集质量的 sessionPreset,例如 AVCaptureSessionPresetMedium,那系统会根据当前摄像头的支持情况使用相应质量等级的分辨率进行采集。

    7.1.2 音频采集参数

    当前的 PLSAudioConfiguration 中可自行设定的参数有

    • numberOfChannels
      • 采集时的声道数,默认为 1,并非所有采集设备都支持多声道数据的采集,可以通过检查 [AVAudioSession sharedInstance].maximumInputNumberOfChannels 得到当前采集设备支持的最大声道数。

    7.1.3 视频编码参数

    当前的 PLSVideoConfiguration 中可自行设定的参数有

    • videoProfileLevel

      • H.264 编码时对应的 profile level 影响编码压缩算法的复杂度和编码耗能。设置的越高压缩率越高,算法复杂度越高,相应的可能带来发热量更大的情况。如果对于视频编码有额外的需求并且知晓该参数带来的影响可以自行更改。默认情况下使用 AVVideoProfileLevelH264HighAutoLevel。
    • videoSize

      • 编码的分辨率,对于采集到的图像,编码前会按照这个分辨率来做拉伸或者裁剪
    • expectedSourceVideoFrameRate
      • 预期视频的编码帧率,这个数值对编码器的来说并不是直接限定了 fps, 而是给编码器一个预期的视频帧率,最终编码的视频帧率,是由实际输入的数据决定的
    • videoMaxKeyframeInterval
      • 两个关键帧的帧间隔,一般设置为 FPS 的三倍
    • averageVideoBitRate
      • 平均的编码码率,设定后编码时的码率并不会是恒定不变,静物较低,动态物体会相应升高

    7.1.4 音频编码参数

    相比于视频繁杂的参数,当前 PLSAudioConfiguration 可配置的参数较为简单,目前提供音频码率和编码器的配置,音频编码默认为 AAC-LC。

    各 Quality 的对比:

    Quality Audio BitRate(Kbps)
    QualityHigh1 64
    QualityHigh2 96
    QualityHigh3 128

    7.1.5 切换视频配置

    为了满足拍摄过程中,拍摄不同分辨率的视频等情况下对码率、FPS 等参数的调节,PLShortVideoSession 提供了重置采集、编码参数的方法。

    • 在拍摄前、拍摄结束后调用下面的方法来重置 configuration

    - (void)reloadvideoConfiguration:(PLSVideoConfiguration *__nonnull)videoConfiguration;

    需要注意的是,通过 reload 方法重置 configuration 时,需要确保传递的 configuration 与当前 session 已经持有的不是一个对象。

    7.2 视频拍摄状态回调

    PLShortVideoKit 中,通过反馈 PLShortVideoRecorder 的 Delegate 回调方法来反馈拍摄的状态。

    • 获取到摄像头原数据时的回调, 便于开发者添加滤镜或美颜处理,需要注意的是这个回调在 camera 数据的输出线程,请不要做过于耗时的操作,否则可能会导致帧率下降
    - (CVPixelBufferRef __nonnull)shortVideoRecorder:(PLShortVideoRecorder *__nonnull)recorder cameraSourceDidGetPixelBuffer:(CVPixelBufferRef __nonnull)pixelBuffer;
    
    • 开始录制一段视频时
    - (void)shortVideoRecorder:(PLShortVideoRecorder *__nonnull)recorder didStartRecordingToOutputFileAtURL:(NSURL *__nonnull)fileURL;
    
    • 正在录制的过程中。在完成该段视频录制前会一直回调,可用来更新所有视频段加起来的总时长 totalDuration UI。
    - (void)shortVideoRecorder:(PLShortVideoRecorder *__nonnull)recorder didRecordingToOutputFileAtURL:(NSURL *__nonnull)fileURL fileDuration:(CGFloat)fileDuration totalDuration:(CGFloat)totalDuration;
    
    • 删除了某一段视频
    - (void)shortVideoRecorder:(PLShortVideoRecorder *__nonnull)recorder didDeleteFileAtURL:(NSURL *__nonnull)fileURL fileDuration:(CGFloat)fileDuration totalDuration:(CGFloat)totalDuration;
    
    • 完成一段视频的录制时
    - (void)shortVideoRecorder:(PLShortVideoRecorder *__nonnull)recorder didFinishRecordingToOutputFileAtURL:(NSURL *__nonnull)fileURL fileDuration:(CGFloat)fileDuration totalDuration:(CGFloat)totalDuration;
    
    • 在达到指定的视频录制时间 maxDuration 后,如果再调用 [PLShortVideoRecorder startRecording],那么会立即执行该回调。该回调功能是用于页面跳转
    - (void)shortVideoRecorder:(PLShortVideoRecorder *__nonnull)recorder didFinishRecordingMaxDuration:(CGFloat)maxDuration;
    

    7.3 水印、美颜和内置滤镜

    7.3.1 水印

    PLShortVideoRecorder 支持内置水印功能,你可以根据自己的需要添加水印或移除水印,并且能够自由设置水印的大小和位置。

    • 拍摄时添加水印
    -(void)setWaterMarkWithImage:(UIImage *__nonnull)waterMarkImage position:(CGPoint)position;
    

    该方法将为视频拍摄时添加一个水印,水印的大小由 waterMarkImage 的大小决定,位置由 position 决定,需要注意的是这些值都是以采集数据的像素点为单位的。例如我们使用 AVCaptureSessionPreset1280x720 进行采集,同时 wateMarkImage.size(100, 100) 对应的 origin(200, 300),那么水印的位置将在大小为 1280x720 的采集画幅中位于 (200, 300) 的位置,大小为 (100, 100)

    • 移除水印
    -(void)clearWaterMark;
    

    该方法用于移除已添加的水印

    7.3.2 美颜

    'PLShortVideoRecorder' 支持内置美颜功能,你可以根据自己的需要选择开关美颜功能,并且能够自由调节包括美颜,美白,红润等在内的参数。

    • 按照默认参数开启或关闭美颜
    -(void)setBeautifyModeOn:(BOOL)beautifyModeOn;
    
    • 设置美颜程度,范围为 0 ~ 1
    -(void)setBeautify:(CGFloat)beautify;
    
    • 设置美白程度,范围为 0 ~ 1
    -(void)setWhiten:(CGFloat)whiten;
    
    • 设置红润程度,范围为 0 ~ 1
    -(void)setRedden:(CGFloat)redden;
    

    7.3.3 录制时内置滤镜

    'PLShortVideoRecorder' 支持录制时启用内置滤镜功能,能够自由调节多种滤镜效果。

    按照默认参数开启或关闭录制时内置滤镜,选择需要的滤镜效果。

    @property (strong, nonatomic) PLSFilter *currentFilter;
    @property (assign, nonatomic) NSInteger filterIndex;
    

    7.4 外部导入音视频数据

    从 v1.2.0 开始,PLShortVideoRecorder 支持外部导入音视频数据存成 mp4。该功能使得 SDK 可以满足更多的应用场景,如在 App 的视图和摄像头数据之间切换等。需要使用该功能时,通过以下接口

    - (nonnull instancetype)initWithVideoConfiguration:(PLSVideoConfiguration *__nonnull)videoConfiguration 
                                    audioConfiguration:(PLSAudioConfiguration *__nonnull)audioConfiguration 
                                        captureEnabled:(BOOL)captureEnabled;
    

    来初始化 PLShortVideoRecorder 对象,并为参数 captureEnabled 传入 NO 即可。

    7.4.1 导入音频数据

    通过以下接口

    - (void)writeSampleBuffer:(CMSampleBufferRef _Nonnull)sampleBuffer;
    

    来导入音频数据。注意,如果初始化 PLShortVideoRecorder 时参数 captureEnabled 为 YES 时,将使用 SDK 内部采集的音频数据,该接口将不起作用。

    7.4.2 导入视频数据

    通过以下接口

    - (void)writePixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer timeStamp:(CMTime)timeStamp;
    

    来导入视频数据。注意,如果初始化 PLShortVideoRecorder 时参数 captureEnabled 为 YES 时,将使用 SDK 内部采集的视频数据,该接口将不起作用。另外,导入视频数据的频率应该与 PLSVideoConfiguration 中设置帧率一致,否则将出现音画不同步。

    7.4.3 录制 App 视图

    开发者可以通过定时(比如每隔 50ms)给 App 中的 UIView 截图,并将其生成 CVPixelBufferRef 后通过上述导入视频数据接口导入到 SDK 中存成 mp4 文件,如果上述的 UIViewUIApplicationkeyWindow,其效果便相当于给 App 录屏了。将 UIView 截图并生成 CVPixelBufferRef 可参考如下方法:

    - (CVPixelBufferRef)createCVPixelBufferWithView:(UIView *)view {
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
        [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                                 [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                                 @{}, kCVPixelBufferIOSurfacePropertiesKey,
                                 nil];
    
        CVPixelBufferRef pxbuffer = NULL;
    
        CGFloat frameWidth = CGImageGetWidth([image CGImage]);
        CGFloat frameHeight = CGImageGetHeight([image CGImage]);
    
        CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault,
                                              frameWidth,
                                              frameHeight,
                                              kCVPixelFormatType_32BGRA,
                                              (__bridge CFDictionaryRef) options,
                                              &pxbuffer);
    
        if (status != kCVReturnSuccess) {
            return NULL;
        }
    
        CVPixelBufferLockBaseAddress(pxbuffer, 0);
        void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
        CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    
        CGContextRef context = CGBitmapContextCreate(pxdata,
                                                     frameWidth,
                                                     frameHeight,
                                                     8,
                                                     CVPixelBufferGetBytesPerRow(pxbuffer),
                                                     rgbColorSpace,
                                                     kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    
        CGContextConcatCTM(context, CGAffineTransformIdentity);
        CGContextDrawImage(context, CGRectMake(0,
                                               0,
                                               frameWidth,
                                               frameHeight),
                           [image CGImage]);
        CGColorSpaceRelease(rgbColorSpace);
        CGContextRelease(context);
    
        CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
    
        return pxbuffer;
    }
    

    7.5 文字动画导出为视频文件

    从 1.10.0 开始,PLSTransitionMaker 用于将 文字动画 和 图片动画 转换为视频文件。支持文字内容、文字字体、文字位置编辑以及图片动画的编辑,PLSTextSetting 为文字编辑对象、PLSImageSetting 为图片编辑对象。PLSPositionTransitionPLSRotateTransitionPLSScaleTransitionPLSFadeTranstion 分别为 SDK 提供的四种动画特效:位置特效、旋转特效、缩放特效和隐藏/显示特效,通过四种特效的组合,能满足绝大多数的开发者需求

    7.5.1 文字对象添加

    开发者可以通过

    - (NSInteger)addText:(PLSTextSetting *)textSetting;
    - (void)updateTextWithResourceID:(NSInteger)resourceID newTextSetting:(PLSTextSetting *)textSetting;
    

    添加文字对象或者更新文字对象,addText 返回添加的文字对象 ID,更新的时候,传入要更新文字对象 ID 和新的文字对象

    7.5.2 图片对象添加

    开发者可以通过

    - (NSInteger)addImage:(PLSImageSetting *)imageSetting;
    - (void)updateImageWithResourceID:(NSInteger)resourceID newImageSetting:(PLSImageSetting *)imageSetting;
    

    添加图片对象或者更新图片对象,addImage 返回添加的图片对象 ID,更新的时候,传入要更新图片对象 ID 和新的文字对象

    7.5.3 文字或图片动画添加

    开发者可以通过

    - (void)addTransition:(PLSTransition *)transition resourceID:(NSInteger)resourceID;
    

    来文字和图片的动画效果

    7.5.4 动画效果预览

    'PLSTransitionMaker' 内部根据开发者设置的文字、图片、动画,实时生成视频预览效果,开发者可以通过

    - (void)play;
    - (void)transitionMakerPreviewEnd:(PLSTransitionMaker *)transitionMaker;
    

    来预览和接收预览结束的回调

    7.5.5 导出为视频文件

    开发者可以通过

    - (void)startMaking;
    

    来启动导出视频文件

    7.5.6 导出视频文件回调

    开发者可以通过

    - (void)transitionMaker:(PLSTransitionMaker *)transitionMaker exportMediaSucceed:(NSURL *)outURL;
    - (void)transitionMaker:(PLSTransitionMaker *)transitionMaker exportMediaFailed:(NSError *)error;
    

    来接收导出视频文件成功和失败的回调

    8 视频存放目录

    8.1 1.5.0及以上版本视频存放目录

    • 根目录:Documents/PLShortVideoRootFolder
    • 拍摄、编辑、导出的视频目录:Documents/PLShortVideoRootFolder/PLShortVideo
    • 上传到云端的视频目录:Documents/PLShortVideoRootFolder/PLShortVideoUploader
    • 用视频生成的 GIF 图目录:Documents/PLShortVideoRootFolder/PLShortVideoGifComposer
    • 视频倒序(时光倒流)视频目录:Documents/PLShortVideoRootFolder/PLShortVideoReverser

    8.2 1.5.0以下版本视频存放目录

    • 拍摄、编辑、导出的视频目录:Documents/PLShortVideo
    • 上传到云端的视频目录:Documents/PLShortVideoUploaderRecorder
    • 用视频生成的 GIF 图目录:Documents/PLShortVideoGifComposer
    • 视频倒序(时光倒流)视频目录:Documents/PLShortVideoReverser

    9 历史记录

    • 1.13.1

      • 优化拍摄页面使用 UIImagePickerController 打开系统相机之后再返回拍摄页面导致预览画面不能铺满屏幕的问题
      • 优化首次启动短视频录制出现的已录制视频时长回调顺序不对的问题
      • 优化短视频编辑 PLShortVideoEditor 更新背景音乐的 timeRange 之后,首次播放时背景音乐起始部分重复播放的问题
      • 修复 Swift 开发环境下调用视频拍摄接口时,实现正在录制中的回调 shortVideoRecorder: didRecordingToOutputFileAtURL: fileDuration: totalDuration: 导致 Crash 的问题
    • 1.13.0

      • 支持设置视频转码帧率
      • 支持视频转码时裁剪视频像素区域
      • 优化素材视频合拍音频数据回调格式,由 CMSampleBufferRef 修改为 AudioBufferlist
      • 优化图片转视频模块生成的视频时长不精准的问题
      • 优化 pod install 或 update PLShortVideoKit 时进度缓慢的问题
      • 修复 PLSEditPlayer 在 iOS 9.0 以下无法播放的问题
      • 修复 PLSMovieComposer 拼接 16 个以上视频失败的问题
      • 修复 SDK 无法处理 5.1 声道的视频的问题
      • 修复素材合拍,素材视频没有音频轨道时合拍失败的问题
    • 1.11.1

      • 优化视频拍摄效果,手动对焦的同时自动调整曝光位置
      • 优化对 4K 视频的处理
      • 优化短视频录制时 App 从后台回到前台自动开启录制的问题
      • 优化 PLSEditPlayer seek 逻辑,能达到帧级别的 seek
      • 优化 PLSEditPlayer 频繁添加背景音乐逻辑
      • 优化对某些特殊视频进行编辑,首帧解码失败导致播放画面黑屏的问题
      • 修复对某些特殊视频进行剪裁崩溃的问题
      • 修复从手机系统相册导入视频进行编辑,部分视频方向不正确的问题
      • 修复 PLSGLProgram 类名重复的问题
      • 修复 PLShortVideoEditor 添加多音效首次预览的时候,播放时间点不对的问题
      • 修复素材合拍 App 从后台回到前台无法继续录制的问题
      • 修复 PLSAssetExportSession 在没有设置 PLSAudioSettingsKey 时视频剪裁不生效的问题
    • 1.11.0

      • 支持摄像头与素材视频合拍功能
      • 支持多个视频进行任意布局的拼图合并
      • 支持对图片、GIF 进行录制
      • 支持图片旋转动画录制
      • 支持视频录制阶段从指定位置播放背景音乐
      • 支持视频编辑阶段按指定时间段预览添加的贴图、文字、涂鸦
      • 支持视频编辑阶段添加多个背景音效功能
      • 支持视频编辑阶段背景音乐循环播放和仅播放一次
      • 支持视频转码自定义码率
      • 支持视频转码自定义输出视频地址
      • 支持视频导出自定义码率
      • 支持视频导出自定义输出视频地址
      • 修复视频录制阶段开启横竖屏检测后横屏拍摄出现的首帧画面闪烁的问题
      • 修复视频编辑阶段裁剪背景音乐后若背景音乐总时长为0时导致程序出现死循环的问题
      • 修复视频编辑阶段裁剪背景音乐后循环播放到第二次时背景音乐停止播放的问题
      • 修复视频编辑阶段截取视频再执行倍速效果后视频后半部分没有倍速效果的问题
      • 修复少数机型上 GIF 制作失败的问题
      • 修复多个视频拼接导出偶现失败的问题
      • 修复视频切割导出偶现失败的问题
      • 修复 H.265 视频转码之后首帧黑屏的问题
    • 1.10.0

      • 支持文字动画转换为视频文件
      • 支持多个视频同时进行切割编辑
      • 对能直接 H.265 硬解码的机型支持导入 H.265 格式视频文件进行转码
      • 支持在视频任意位置插入文字转场视频编辑
      • 支持 PLSUploaderConfiguration 上传 params 设置
      • 支持倍速录制视频时以对应的倍速播放背景音乐
      • 优化 PLSEditPlayer 在暂停的时候 seek 时预览画面刷新逻辑
      • 修复录制时播放背景音乐,并在录制结束后再次合成背景音乐导致有两重背景音乐声音的问题
      • 修复多张图片合成视频时设置图片持续时间导致的最后一张图片没有被合入视频的问题
      • 更新人脸贴纸库解决了使用人脸贴纸库后反复进出录制页面导致的崩溃问题
    • 1.9.0

      • 支持抖音特效
      • 支持拍摄时截取图片
      • 支持编辑类 PLShortVideoEditor 和视频导出类 PLSAVAssetExportSession 回调出视频的时间戳
      • 修复快速开始和停止视频录制导致偶现文件写入报错的问题
      • 修复编辑时添加背景音乐导致视频没有从剪切的起始位置处播放的问题
      • 修复编辑类 PLShortVideoEditor 的回调不执行的问题
      • 修复 1:1 比例的视频添加涂鸦、文字、图片后导出的视频出现倒立的问题
      • 修复添加 MV 特效导出视频后原视频和背景音乐的音量大小不生效的问题
      • 修复添加 MV 特效后只能固定输出某个视频分辨率的问题。
      • 修复同时快速切换摄像头和滤镜偶现的 Crash 问题
      • 修复在拒绝麦克风权限情形下添加背景音乐录制视频后进入编辑时 Crash 的问题
      • 修复在拒绝相机权限情形下录制结束后进入编辑时 Crash 的问题
      • 修复在拒绝相机和麦克风权限情形下视频录制结束后进行视频导出操作没有回调 Error 信息的问题
      • 修复倍速拍摄后在编辑时不同倍速视频段衔接处会出现视频帧闪烁的问题
    • 1.8.0

      • 支持视频拍摄时自定义视频存放地址
      • 支持转码时旋转视频
      • 支持日志系统
      • 修复 MV 特效在某种特定情形下预览不生效的问题
      • 优化图片合成视频的效果
      • 修复横屏拍摄时前几帧画面偏暗的问题
    • 1.7.0

      • 支持文字特效
      • 支持视频涂鸦
      • 支持视频贴纸
      • 支持图片合成视频
      • 支持视频草稿
      • 支持拍摄时录制背景音乐
      • 支持编辑时旋转视频
      • 支持编辑时使用视频首帧作为滤镜封面图
      • 修复编辑时音乐时长小于视频时长时音乐不随视频循环播放的问题
    • 1.6.0

      • 支持配音功能
      • 支持编辑时对视频进行变速处理
      • 支持 AR 特效拍摄
      • 支持摄像头对焦位置的回调
      • 修复横竖屏自动切换的拍摄模式下设备方向检测不精准的问题
      • 修复视频拍摄时使用前置 AVCaptureSessionPreset1920x1080 预览黑屏的问题
      • 修复频繁切换 1:1 与全屏录制模型出现的预览黑屏问题
      • 修复录屏偶现 Crash 的问题
      • 修复视频转码偶现 Crash 的问题
      • 修复多个视频拼接使用视频拼接模块后生成的视频体积变大的问题
      • 修复背景音乐与视频时长相同时导出的视频无声音的问题
      • 修复 iPhone 5 设备上将视频转码成 1080P 后快速执行视频导出偶现 Crash 的问题
    • 1.5.0

      • 支持 MV 特效
      • 支持时光倒流特效
      • 更新视频文件的存储目录
    • 1.4.1

      • 修复 iOS 11 系统上添加滤镜导致预览卡住的问题
      • 修复拍摄时对焦动画引发的内存泄漏问题
      • 更新上传依赖库 Qiniu 去适配 iOS 11 系统
    • 1.4.0

      • 支持倍速拍摄
      • 支持多视频拼接
      • 增加取消 GIF 合成接口
    • 1.3.0

      • 支持横屏拍摄
      • 支持合成 GIF 动图
      • 修复录制时频繁切换滤镜导致预览卡住的问题
      • 修复快速执行开始和停止录制导致的 crash 问题
    • 1.2.1

      • 修复首次安装后第一次录制无法预览和采集的问题
      • 修复被裁减的视频执行静音导出后起始时间内未静音的问题
      • 更新滤镜封面图
    • 1.2.0

      • 支持录屏
      • 支持手动对焦动画
      • 修复偶现视频合成失败问题
      • 修复剪辑的视频导出后时长少零点几秒的问题
    • 1.1.1

      • 支持视频转码修正视频方向
      • 修复无音频轨视频合成失败问题
    • 1.1.0

      • 支持视频转码
      • 支持断点续传
      • 支持裁剪背景音乐
    • 1.0.4

      • 支持录制时启用内置滤镜
      • 优化 mp4 文件大小
      • 支持视频上传到云端
    • 1.0.3

      • 支持背景音乐
    • 1.0.2

      • 选取相册中的单个视频并编辑
      • 优化 1:1 录制,捕捉摄像头的中心画面
    • 1.0.1

      • 优化水印效果
      • 修复音频采集回调中的数据类型
      • 修复 iOS 8.1 上拍摄视频时预览视图卡住的问题
    • 1.0.0

      • 支持 H.264、AAC 硬编码
      • 支持断点拍摄
      • 支持回删视频
      • 支持视频水印
      • 内置实时美颜
      • 内置几十种专业级滤镜
      • 支持第三方美颜和滤镜
      • 支持自定义录制时长
      • 支持分辨率码率配置
      • 支持 1:1 录制

    10 FAQ

    10.1 SDK 是否收费,哪里可以下载 ?

    本短视频 SDK 需授权方可使用,可通过 400-808-9176 转 2 号线联系七牛商务咨询,或者 通过工单 联系七牛的技术支持。

    10.2 我可以体验下 demo 吗 ?

    可以,请到 App Store 搜索:PLShortVideo 七牛云 七牛云短视频 七牛短视频

    10.3 是否支持人脸特效、动态贴纸等 ?

    支持,该功能属于高级收费功能,需要联系商务获取资源

    10.4 是否支持抖音特效?

    支持,该功能属于高级收费功能,需要联系商务获取 appkey 和资源文件。具体使用可参看 demo

    10.5 是否支持视频播放 ?

    生成和上传的 mp4 文件,可以用系统的播放器播放,如果需要更高级的播放功能,推荐使用七牛的 PLPlayerKit 播放 SDK

    10.6 导出的视频支持哪些格式 ?

    支持 mp4 和 mov 格式。

    10.7 AR 特效是否支持其他场景或者定制?

    支持,请通过 400-808-9176 转 2 号线联系七牛商务咨询,或者通过工单 联系七牛的技术支持。

    以上内容是否对您有帮助?
  • Icon free helper
    Close