相机采集:摄像头、麦克风采集数据样本(YUV/PCM),相机功能设置。
样本转换:将采集的数据样本转换成图像
画面预览:将图像渲染到画布
编辑模块:添加美颜、滤镜、动态贴纸等
录制:视频多段录制、回删等
素材模块
为了方便您快速集成,我们将特效相机逻辑封装在进阶使用类(TTPipeMediator)中,您只需控制采集时机即可。
接口文件 | 功能 |
---|---|
TTPipeMediator | 进阶使用类 |
TTImageConvert | 图像转换 |
TTAudioConvert | 音频转换 |
TTPreviewManager | 画面预览 |
TTRecordManager | 视频录制 |
TTBeautyManager | 美颜特效 |
示例
// TTCameraMediator.m
- (TUPFPImage *)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer {
NSInteger timestamp = [TTPipeMediator timestampWithSampleBuffer:sampleBuffer];
[_queue runSync:^{
TUPFPImage *fpImage = [self.imageConvert sendVideoSampleBuffer:sampleBuffer];
// 前后处理: 美颜、滤镜等
TUPFPImage *processFPImage = [self.beautyManager sendFPImage:fpImage];
// 预览
[self.previewManager update:self.outputFPImage];
// 录制
[self.recordManager sendFPImage:self.outputFPImage timestamp:timestamp];
self.outputFPImage = processFPImage;
}];
return self.outputFPImage;
}
// TTPipeMediator.h
/**
* 初始化预览画面
* @param containerView 容器视图
*/
- (instancetype)initWithContainer:(UIView *)containerView;
/**
* 向 SDK 发送采集的视频数据 并返回处理过图像
* @param sampleBuffer 视频样本 yuv/bgra
* @return 返回处理过的图像
*/
- (TUPFPImage *)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
* 向 SDK 发送采集的音频数据
* @param sampleBuffer 音频样本 pcm
*/
- (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
* 向 SDK 发送播放的音频数据
* @param bufferList 需要赋值音频数据
*/
- (void)sendAudioPlayBufferList:(AudioBufferList)bufferList;
/**
* 设置视频像素格式
* @param pixelFormat yuv bgra
*/
- (void)setPixelFormat:(TTVideoPixelFormat)pixelFormat;
/**
* 设置样本输出分辨率(size 归一化)
*/
- (void)setOutputSize:(CGSize)outputSize;
/**
* 设置变声
* @param soundPitchType 变声类型
*/
- (void)setSoundPitchType:(TTVideoSoundPitchType)soundPitchType;
/**
* 设置背景音乐
* @param path 音乐路径
*/
- (void)setBGM:(NSString *)path;
// MARK: - Editor
////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 获取美颜对象
* 美肤、微整形、美妆、滤镜、动态贴纸、哈哈镜
* @return 获取美颜对象管理器
*/
- (TTBeautyManager *)getBeautyManager;
/**
* 设置合拍
* @param direction 布局
* @param videoPath 视频地址
*/
- (void)setJoiner:(TTJoinerDirection)direction videoPath:(NSString *)videoPath;
// MARK: - Preview
////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 设置画面比例
* @param aspectRatio full 3:4 1:1
*/
- (void)setAspectRatio:(TTVideoAspectRatio)aspectRatio;
/**
* 设置画面背景颜色
* @param backgroundColor 背景颜色
*/
- (void)setBackgroundColor:(UIColor *)backgroundColor;
/**
* 拍照/截图
*/
- (UIImage *)snapshot;
// MARK: - Record
////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 设置视频录制的委托对象
* @param recordDelegate TTRecordListener
*/
- (void)setRecordDelegate:(id<TTRecordListener>)recordDelegate;
/// start/resume recording
- (BOOL)startRecording;
/**
* 暂停录制 每一次暂停录制都会生成一个视频片段
*/
- (void)pauseRecord;
/**
* 结束录制
*/
- (void)stopRecord;
/**
* 删除当前录制视频最后一片段
*/
- (void)deleteLastRecordPart;
/**
* 设置录制速率
* @param recordSpeed 录制速率
*/
- (void)setRecordSpeed:(TTVideoRecordSpeed)recordSpeed;
/**
* 获取录制总进度
*/
- (CGFloat)getRecordingProgress;
/**
* 设置是否静音录制,默认为NO
* @param isMute 静音状态
*/
- (void)setMute:(BOOL)isMute;
/// 销毁
- (void)destory;
摄像头、麦克风采集数据样本(YUV/PCM)。包括摄像头切换、闪光灯、画面对焦、分辨率及码率设置等
接口文件 | 功能 |
---|---|
TuCamera | 相机采集功能 |
TTAudioUnitManager | 回声消除音频录制 |
示例
@interface TTViewController () <TuCameraAudioDataOutputDelegate, TuCameraVideoDataOutputDelegate>
@property(nonatomic, strong) TuCamera *capture; //相机
@end
@implementation TTViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setupCapture];
}
//启动相机
- (void)setupCapture {
_capture = [[TuCamera alloc] init];
// 是否支持双指缩放来调节焦距
_capture.enableZoom = YES;
// 准备初始化相机
[_capture prepare];
_capture.audioDataOutputDelegate = self;
_capture.videoDataOutputDelegate = self;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 相机启动预览
[self.capture startPreview];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 相机停止预览
[self.capture pausePreview];
}
// MARK: - TuCameraVideoDataOutputDelegate、TuCameraAudioDataOutputDelegate
/**
* 相机采集视频回调
* @param sampleBuffer 相机采集返回的视频数据
*/
- (void)onTuCameraDidOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer {
}
/**
* 麦克风采集音频回调
* @param bufferList 麦克风采集返回的音频数据
*/
- (void)onTuCameraDidOutputAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer {
}
/**
* 麦克风采集音频回调
* @param bufferList 麦克风采集返回的音频数据
*/
- (void)onTuCameraDidOutputPlayBufferList:(AudioBufferList)bufferList {
}
@end
调整相机参数
#import<TuCamera/TuCamera.h>
/** 当前相机状态 */
@property(nonatomic, readonly) TuCameraState status;
/** 设置相机前后位置 */
@property(nonatomic) AVCaptureDevicePosition devicePosition;
// 摄像头输出方向和镜像设置
@property(nonatomic, assign) AVCaptureVideoOrientation frontCameraOrientation;
@property(nonatomic, assign) BOOL frontCameraMirrored;
@property(nonatomic, assign) AVCaptureVideoOrientation backCameraOrientation;
@property(nonatomic, assign) BOOL backCameraMirrored;
/** 设置采集分辨率 */
@property(nonatomic) AVCaptureSessionPreset sessionPreset;
/** 设置帧率 */
@property(nonatomic) NSInteger fps;
/** 开启/关闭 闪光灯 */
@property(nonatomic) AVCaptureFlashMode flashMode;
@property(nonatomic) AVCaptureTorchMode torchMode;
/** 是否允许使用聚焦拍摄 */
@property(nonatomic, assign) BOOL allowFocusToShot;
/** 是否开启自动聚焦 */
@property(nonatomic) BOOL enableAutoFocus;
/** 禁用系统拍照声音 (默认:false) */
@property(nonatomic) BOOL disableCaptureSound;
/** 准备初始化相机 [是否初始化成功] */
- (BOOL)prepare;
/** 开始预览 [是否启动摄像头成功] */
- (BOOL)startPreview;
/** 暂停预览 [是否成功暂停预览] */
- (BOOL)pausePreview;
/** 恢复预览 [是否成功恢复预览] */
- (BOOL)resumePreview;
/** 停止预览 */
- (void)stopPreview;
/** 拍摄照片 [是否开始拍摄] */
- (BOOL)shotPhoto;
/** 切换前后摄像头 [是否启动摄像头成功] */
- (BOOL)rotateCamera;
/** 设置曝光强度 */
- (BOOL)setExposureBias:(float)percent;
/** 是否支持闪光灯 */
- (BOOL)isFlashModeSupport:(AVCaptureFlashMode)mode;
- (BOOL)isTorchModeSupport:(AVCaptureTorchMode)mode;
将采集的数据样本转换成 FPImage。
接口文件 | 功能 |
---|---|
TTImageConvert | 样本转换 |
TUPFPImage | 图像结构 |
// TTProcessManager.h
/**
* 向 SDK 发送采集的视频数据 返回图像
* @param sampleBuffer 视频样本
*/
- (TUPFPImage *)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
* 向 SDK 发送采集的视频数据 返回图像
* @param pixelBuffer 视频样本
*/
- (TUPFPImage *)sendVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer;
/**
* 向 SDK 发送采集的视频数据 返回图像
* @param pixelBuffer 视频样本
* @param timestamp 连续时间戳
* @param rotation 旋转方向
* @param flip 是否上下镜像
* @param mirror 是否左右镜像
*/
- (TUPFPImage *)sendVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer withTimestamp:(int64_t)timestamp rotation:(int)rotation flip:(BOOL)flip mirror:(BOOL)mirror;
像素格式、采样分辨率
/**
* 设置视频像素格式
* @param pixelFormat yuv bgra
*/
- (void)setPixelFormat:(TTVideoPixelFormat)pixelFormat;
/// 设置样本输出分辨率(size 归一化)
- (void)setOutputSize:(CGSize)outputSize;
//对象销毁
- (void)destory;
将采集的数据样本添加变速、变调、混音等。
接口文件 | 功能 |
---|---|
TTAudioConvert | 音频转换 |
// TTAudioConvert.h
@protocol TTAudioConvertDelegate <NSObject>
@optional
/**
* 转换回调
* @param audioConvert 转换会话
* @param pcm pcm buffer
* @param len 数据长度
*/
- (void)audioConvert:(TTAudioConvert *)audioConvert didOutputPCMData:(void *)pcm len:(size_t)len;
@end
@interface TTAudioConvert : NSObject
/**
* 初始化转换会话
* @param delegate 委托
* @param queue 操作队列
*/
- (instancetype)initWithDelegate:(id<TTAudioConvertDelegate>)delegate delegateQueue:(TUPDispatchQueue *)queue NS_DESIGNATED_INITIALIZER;
/**
* 向 SDK 发送采集的音频数据
* @param sampleBuffer 音频样本 pcm
*/
- (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
* 向 SDK 发送播放的音频数据 需要添加背景音乐
* @param bufferList 需要赋值的音频数据
*/
- (void)sendAudioPlayBufferList:(AudioBufferList)bufferList;
/**
* 设置变声
* @param soundPitchType 变声类型
*/
- (void)setSoundPitchType:(TTVideoSoundPitchType)soundPitchType;
/**
* 设置背景音乐
* path 背景音乐路径
*/
- (void)setBGM:(NSString *)path;
/**
* 开始混音
* @param startTime 音乐播放起始时间
*/
- (void)startMixerFromTime:(NSInteger)startTime;
/// 暂停播放背景音乐
- (void)pauseBGM;
/**
* 停止播放背景音乐
*/
- (void)stopBGM;
/// 销毁
- (void)destory;
将TUPFPImage渲染到画布
接口文件 | 功能 |
---|---|
TTPreviewManager | 画面预览 |
TUPFPImage | 图像 |
// TTPreviewManager.h
/**
* 初始化预览画布
* @param containerView 容器视图
*/
- (instancetype)initWithContainer:(UIView *)containerView NS_DESIGNATED_INITIALIZER;
/**
* 更新预览画面
* @param fpImage 图像显示
*/
- (void)update:(TUPFPImage *)fpImage;
画面比例、背景颜色、拍照/截图
// TTPreviewManager.h
/**
* 设置画面比例
* @param aspectRatio full 3:4 1:1
*/
- (CGRect)setAspectRatio:(TTVideoAspectRatio)aspectRatio;
/**
* 设置画面背景颜色
* @param backgroundColor 背景颜色
*/
- (void)setBackgroundColor:(UIColor *)backgroundColor;
/// 拍照/截图
- (UIImage *)snapshot;
/// 销毁
- (void)destory;
在预览、视频录制的过程中,您可以给画面设置各种特效。
接口文件 | 功能 |
---|---|
TTBeautyManager | 美颜特效 |
TUPFPImage | 图像 |
/**
* 初始化美颜会话
* @param queue 操作队列
*/
- (instancetype)initWithQueue:(TUPDispatchQueue *)queue NS_DESIGNATED_INITIALIZER;
/**
* 向 美颜 发送图像 并返回编辑处理后的图像
* @param fpImage 图像
*/
- (TUPFPImage *)sendFPImage:(TUPFPImage *)fpImage;
/**
* 添加特效
* @param effectType 特效类型
*/
- (void)addEffect:(TTEffectType)effectType;
/**
* 移除特效
* @param effectType 特效类型
*/
- (void)removeEffect:(TTEffectType)effectType;
/**
* 重置特效
* @param effectType 特效类型
*/
- (void)resetEffect:(TTEffectType)effectType;
/// 销毁
- (void)destory;
// TTBeautyManager.h
// MARK: - 美肤
/**
* 设置美肤(磨皮)算法
* @param skinStyle 自然 极致 新美颜
*/
- (void)setSkinStyle:(TTSkinStyle)skinStyle;
/// 设置磨皮级别 取值范围0 - 1
- (void)setSmoothLevel:(float)level;
/// 设置美白级别 取值范围0 - 1
- (void)setWhiteningLevel:(float)level;
/// 设置红润级别 取值范围0 - 1
- (void)setRuddyLevel:(float)level;
/// 设置锐化级别 取值范围0 - 1
- (void)setSharpenLevel:(float)level;
// MARK: - 微整形
/// 设置大眼级别 取值范围0 - 1
- (void)setEyeEnlargeLevel:(float)level;
/// 设置瘦脸级别 取值范围0 - 1
- (void)setCheekThinLevel:(float)level;
/// 设置窄脸级别 取值范围0 - 1
- (void)setCheekNarrowLevel:(float)level;
/// 设置小脸级别 取值范围0 - 1
- (void)setFaceSmallLevel:(float)level;
/// 设置瘦鼻级别 取值范围0 - 1
- (void)setNoseWidthLevel:(float)level;
/// 设置长鼻级别 取值范围0 - 1
- (void)setNoseHeightLevel:(float)level;
/// 设置嘴型级别 取值范围-1 - 1
- (void)setMouthWidthLevel:(float)level;
/// 设置唇厚级别 取值范围-1 - 1
- (void)setLipsThicknessLevel:(float)level;
/// 设置瘦人中级别 取值范围-1 - 1
- (void)setPhilterumThicknessLevel:(float)level;
/// 设置细眉级别 取值范围-1 - 1
- (void)setBrowThicknessLevel:(float)level;
/// 设置眉高级别 取值范围-1 - 1
- (void)setBrowHeightLevel:(float)level;
/// 设置下巴(拉伸或收缩)级别 取值范围-1 - 1
- (void)setChinThicknessLevel:(float)level;
/// 设置下颌骨级别 取值范围0 - 1
- (void)setCheekLowBoneNarrowLevel:(float)level;
/// 设置眼角级别 取值范围-1 - 1
- (void)setEyeAngleLevel:(float)level;
/// 设置开内眼角级别 取值范围0 - 1
- (void)setEyeInnerConerLevel:(float)level;
/// 设置开外眼角级别 取值范围0 - 1
- (void)setEyeOuterConerLevel:(float)level;
/// 设置眼距级别 取值范围-1 - 1
- (void)setEyeDistanceLevel:(float)level;
/// 设置眼移动级别 取值范围-1 - 1
- (void)setEyeHeightLevel:(float)level;
/// 设置发际线级别 取值范围-1 - 1
- (void)setForeheadHeightLevel:(float)level;
/// 设置瘦颧骨级别 取值范围0 - 1
- (void)setCheekBoneNarrowLevel:(float)level;
// MARK: - 微整形改造
/// 设置双眼皮级别 取值范围0 - 1
- (void)setEyelidLevel:(float)level;
/// 设置卧蚕级别 取值范围0 - 1
- (void)setEyemazingLevel:(float)level;
/// 设置白牙级别 取值范围0 - 1
- (void)setWhitenTeethLevel:(float)level;
/// 设置亮眼级别 取值范围0 - 1
- (void)setEyeDetailLevel:(float)level;
/// 设置祛黑眼圈级别 取值范围0 - 1
- (void)setRemovePouchLevel:(float)level;
/// 设置祛法令纹级别 取值范围0 - 1
- (void)setRemoveWrinklesLevel:(float)level;
// MARK: - 美妆
/// 设置口红开关
- (void)setLipEnable:(BOOL)enable;
/// 设置口红样式
/// @param style 水润 滋润 雾面
- (void)setLipStyle:(TTBeautyLipstickStyle)style;
/// 设置口红不透明度
- (void)setLipOpacity:(float)opacity;
/// 设置口红贴纸id
- (void)setLipSticker:(float)idt;
/// 设置腮红开关
- (void)setBlushEnable:(BOOL)enable;
/// 设置腮红不透明度
- (void)setBlushOpacity:(float)opacity;
/// 设置腮红贴纸id
- (void)setBlushSticker:(float)idt;
/// 设置眉毛开关
- (void)setBrowEnable:(BOOL)enable;
/// 设置眉毛样式
/// @param style 雾眉 雾根眉
- (void)setBrowStyle:(TTBeautyEyebrowStyle)style;
/// 设置眉毛不透明度
- (void)setBrowOpacity:(float)opacity;
/// 设置眉毛贴纸id
- (void)setBrowSticker:(float)idt;
/// 设置眼影开关
- (void)setEyeshadowEnable:(BOOL)enable;
/// 设置眼影不透明度
- (void)setEyeshadowOpacity:(float)opacity;
/// 设置眼影贴纸id
- (void)setEyeshadowSticker:(float)idt;
/// 设置眼线开关
- (void)setEyelineEnable:(BOOL)enable;
/// 设置眼线不透明度
- (void)setEyelineOpacity:(float)opacity;
/// 设置眼线贴纸id
- (void)setEyelineSticker:(float)idt;
/// 设置睫毛开关
- (void)setEyelashEnable:(BOOL)enable;
/// 设置睫毛不透明度
- (void)setEyelashOpacity:(float)opacity;
/// 设置睫毛贴纸id
- (void)setEyelashSticker:(float)idt;
/// 设置修容开关
- (void)setFacialEnable:(BOOL)enable;
/// 设置修容不透明度
- (void)setFacialOpacity:(float)opacity;
/// 设置修容贴纸id
- (void)setFacialSticker:(float)idt;
// MARK: - 滤镜
/// 设置滤镜
/// @param code 通过 code 在 SDK 内部映射表获取滤镜
- (void)setFilter:(NSString *)code;
/// 设置滤镜的强度
- (void)setFilterStrength:(float)strength;
// MARK: - 动态贴纸、哈哈镜
/// 设置动态贴纸
/// @param idt 贴纸id
- (void)setLiveSticker:(NSInteger)idt;
/// 设置哈哈镜
/// @param monsterStyle TTMonsterStyle
- (void)setMonsterStyle:(TTMonsterStyle)monsterStyle;
// MARK: - 合拍
/// 设置合拍
/// @param direction 布局
/// @param videoPath 视频地址
- (void)setJoiner:(TTJoinerDirection)direction videoPath:(NSString *)videoPath;
/// 更新合拍 布局
/// @param direction 布局
- (void)updateJoinerDirection:(TTJoinerDirection)direction;
/// 设置合拍变速
/// @param speed 速度
/// @param startTime 开始时间
- (void)setJoinerSpeed:(TTVideoRecordSpeed)speed startTime:(NSInteger)startTime;
/// 播放/暂停合拍素材
- (void)playJoiner:(BOOL)playing;
/// 设置合拍开始播放时间
- (void)setJoinerStartTime:(NSInteger)startTime;
/// 获取合拍布局
- (CGRect)getJoinerVideoRect;
视频分段录制、变速录制、视频合成保存等
接口文件 | 功能 |
---|---|
TTRecordManager | 视频录制 |
TUPFPImage | 图像 |
// TTRecordManager.h
/// 向 录制 发送fpImage
/// @param fpImage 图像
/// @param timestamp 时间戳
- (void)sendFPImage:(TUPFPImage *)fpImage timestamp:(NSInteger)timestamp;
/// 向 录制 发送pcm
/// @param pcm 音频
/// @param len 数据长度
- (void)sendPCMData:(void *)pcm len:(size_t)len;
/// start/resume recording
- (BOOL)record;
/// 暂停录制 每一次暂停录制都会生成一个视频片段
- (void)pauseRecord;
/// 结束录制 close the file.
- (void)stopRecord;
/// 取消当前录制
- (void)cancleRecording;
录制速度、声音设置、设置水印
// TTRecordManager.h
/// 最小录制时长 单位: ms 默认: 3000
@property(nonatomic) NSInteger minDuration;
/// 最大录制时长 单位: ms 默认: 15000
@property(nonatomic) NSInteger maxDuration;
/// 音频声道
@property(nonatomic) int channels;
/// 音频采样率
@property(nonatomic) int sampleRate;
/// 设置录制速率
- (void)setRecordSpeed:(TTVideoRecordSpeed)recordSpeed;
/// 获取录制速率
- (TTVideoRecordSpeed)getRecordSpeed;
/// 设置全局水印
/// @param waterMark 全局水印图片
/// @param position 水印位置
- (void)setWaterMark:(UIImage *)waterMark position:(TTVideoWaterMarkPosition)position;
/// 设置是否静音录制
- (void)setMute:(BOOL)isMute;
// TTRecordManager.h
/// 获取录制总时长 单位: ms
- (NSInteger)getDuration;
/// 获取当前录制所有视频片段路径
- (NSArray<NSString *> *)getVideoPathList;
/// 删除当前录制视频最后一片段
- (void)deleteLastPart;
/// 删除当前录制视频所有片段
- (void)deleteAllParts;