类名 | 功能 |
TXVideoInfoReader.h | 媒体信息获取 |
TXVideoEditer.h | 视频编辑 |
// 这以使用了 Demo 中的 Common/UGC/VideoPreview 来做预览的视图#import "VideoPreview.h"@implementation EditViewController{TXVideoEditer *editor;VideoPreview *_videoPreview;}- (void)viewDidLoad {[super viewDidLoad];_videoPreview = [[VideoPreview alloc] initWithFrame:self.view.bounds];[self.view addSubview:_videoPreview];// 编辑预览参数TXPreviewParam *param = [[TXPreviewParam alloc] init];param.videoView = _videoPreview.renderView;param.renderMode = PREVIEW_RENDER_MODE_FILL_EDGE;// 1. 初始化编辑器, 如无需预览,可以传 nil 或直接调用 init 方法TXVideoEditer *editor = [[TXVideoEditer alloc] initWithPreview:param];// 设置源视频路径NSString *path = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"mp4"][editor setVideoPath: path];// 配置代理editor.generateDelegate = self; // 设置生成事件的回调委托对象,可以获取生成进度与结果// 2. 对视频进行处理,这里以添加水印为例[editor setWaterMark:[UIImage imageNamed:@"water_mark"]normalizationFrame:CGRectMake(0,0,0.1,0)];}// 3. 生成视频, 以响应用户点击为例- (IBAction)onGenerate:(id)sender {NSString *output = [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp.mp4"];[editor generateVideo:VIDEO_COMPRESSED_720P videoOutputPath:output];}// 4. 获取生成进度-(void) onGenerateProgress:(float)progress{}// 获取生成结果-(void) onGenerateComplete:(TXGenerateResult *)result{if (result.retCode == 0) {// 生成成功} else {// 生成失败,原因可以查看 result.descMsg}}@end
TXVideoInfoReader 的 getVideoInfo 方法可以获取指定视频文件的一些基本信息,相关接口如下:// 获取视频文件的信息+ (TXVideoInfo *)getVideoInfo:(NSString *)videoPath;/** 获取视频文件信息* @param videoAsset 视频文件属性* @return 视频信息*/+ (TXVideoInfo *)getVideoInfoWithAsset:(AVAsset *)videoAsset;
TXVideoInfo 定义如下:/// 视频信息@interface TXVideoInfo : NSObject/// 视频首帧图片@property (nonatomic, strong) UIImage* coverImage;/// 视频时长(s)@property (nonatomic, assign) CGFloat duration;/// 视频大小(byte)@property (nonatomic, assign) unsigned long long fileSize;/// 视频fps@property (nonatomic, assign) float fps;/// 视频码率 (kbps)@property (nonatomic, assign) int bitrate;/// 音频采样率@property (nonatomic, assign) int audioSampleRate;/// 视频宽度@property (nonatomic, assign) int width;/// 视频高度@property (nonatomic, assign) int height;/// 视频旋转角度@property (nonatomic, assign) int angle;@end
TXVideoInfoReader 的 getSampleImages 可以获取按指定数量,时间间隔相同的预览图:/** 获取视频的采样图列表* @param count 获取的采样图数量(均匀采样)* @param maxSize 缩略图的最大大小,生成的缩略图大小不会超出这个宽高* @param videoAsset 视频文件属性* @param sampleProcess 采样进度*/+ (void)getSampleImages:(int)countmaxSize:(CGSize)maxSizevideoAsset:(AVAsset *)videoAssetprogress:(sampleProcess)sampleProcess;+ (void)getSampleImages:(int)countvideoPath:(NSString *)videoPathprogress:(sampleProcess)sampleProcess;+ (void)getSampleImages:(int)countvideoAsset:(AVAsset *)videoAssetprogress:(sampleProcess)sampleProcess;
VideoRangeSlider 是用了 getSampleImages 获取了10张缩略图来构建一个由视频预览图组成的进度条。/*** 根据时间列表获取缩略图列表* @param asset 视频文件对象* @param times 获取的时间列表* @param maxSize 缩略图大小*/+ (UIImage *)getSampleImagesFromAsset:(AVAsset *)assettimes:(NSArray<NSNumber*> *)timesmaxSize:(CGSize)maxSizeprogress:(sampleProcess)sampleProcess;/* 根据时间获取单帧图片* @param time 获取图片的时间* @param videoPath 视频文件路径*/+ (nullable UIImage *)getSampleImage:(float)time videoPath:(NSString *)videoPath;+ (nullable UIImage *)getSampleImage:(float)time videoAsset:(AVAsset *)videoAsset;
TXVideoEditer 的 initWithPreview 函数用于绑定一个 UIView 给 SDK 来渲染视频画面,通过控制 TXPreviewParam 的 renderMode 来设置自适应与填充两种模式。/** 默认初始化方法* @param param 编辑器画面预览参数* @see TXPreviewParam*/- (instancetype)initWithPreview:(TXPreviewParam *)param;@interface TXPreviewParam : NSObject@property(nonatomic, strong) UIView* videoView; // 视频预览View@property(nonatomic, assign) TXPreviewRenderMode renderMode; // 填充模式@endPREVIEW_RENDER_MODE_FILL_SCREEN - 填充模式,尽可能充满屏幕不留黑边,所以可能会裁剪掉一部分画面。PREVIEW_RENDER_MODE_FILL_EDGE - 适应模式,尽可能保持画面完整,但当宽高比不合适时会有黑边出现。
TXVideoEditer 的 previewAtTime 函数用于定格显示某一个时间点的视频画面。 /** 渲染某一时刻的视频画面* @param time 预览帧时间(s)*/- (void)previewAtTime:(CGFloat)time;
TXVideoEditer 的 startPlayFromTime 函数用于循环播放某一时间段 A<=>B 内的视频片段。/** 播放某一时间段的视频* @param startTime 播放起始时间(s)* @param endTime 播放结束时间(s)*/- (void)startPlayFromTime:(CGFloat)startTimetoTime:(CGFloat)endTime;
// 暂停播放- (void)pausePlay;// 继续播放- (void)resumePlay;// 停止播放- (void)stopPlay;
// 其中 image 为滤镜映射图,image 设置为 nil,会清除滤镜效果。- (void) setFilter:(UIImage *)image;// 设置滤镜效果程度从0到1,越大滤镜效果越明显,默认取值0.5- (void)setSpecialRatio:(float)specialRatio;/*** 设置两个滤镜效果* @param leftFilter 左滤镜图片(nil代表无左滤镜)* @param leftIntensity 左滤镜浓度* @param rightFilter 右滤镜图片(nil代表无右滤)* @param rightIntensity 右滤镜浓度* @param leftRatio 左滤镜所占比例*/- (void)setFilter:(UIImage *)leftFilterleftIntensity:(CGFloat)leftIntensityrightFilter:(UIImage *)rightFilterrightIntensity:(CGFloat)rightIntensityleftRatio:(CGFloat)leftRatio;
TXVideoEditer *_ugcEdit;NSString * path = [[NSBundle mainBundle] pathForResource:@"FilterResource" ofType:@"bundle"];path = [path stringByAppendingPathComponent:@"langman.png"];UIImage* image = [UIImage imageWithContentsOfFile:path];[_ugcEdit setFilter:image];[_ugcEdit setSpecialRatio:0.5];
- (void) setWaterMark:(UIImage *)waterMark normalizationFrame:(CGRect)normalizationFrame;
UIImage *image = [UIImage imageNamed:@"watermark"];[_ugcEdit setWaterMark:image normalizationFrame:CGRectMake(0, 0, 0.3 , 0.3 * image.size.height / image.size.width)];//水印大小占视频宽度的30%,高度根据宽度自适应
- (void) setTailWaterMark:(UIImage *)tailWaterMark normalizationFrame:(CGRect)normalizationFrameduration:(CGFloat)duration;
UIImage *tailWaterimage = [UIImage imageNamed:@"tcloud_logo"];float w = 0.15;float x = (1.0 - w) / 2.0;float width = w * videoMsg.width;float height = width * tailWaterimage.size.height / tailWaterimage.size.width;float y = (videoMsg.height - height) / 2 / videoMsg.height;[_ugcEdit setTailWaterMark:tailWaterimage normalizationFrame:CGRectMake(x,y,w,0) duration:1];
//初始化编辑器TXPreviewParam *param = [[TXPreviewParam alloc] init];param.videoView = videoView;param.renderMode = PREVIEW_RENDER_MODE_FILL_EDGE;ugcEdit = [[TXVideoEditer alloc] initWithPreview:param];//设置 BGM 路径[ugcEdit setBGMAsset:fileAsset result:^(int result) {}];//设置 BGM 开始和结束时间[ugcEdit setBGMStartTime:0 endTime:5];//设置 BGM 是否循环[ugcEdit setBGMLoop:YES];//设置 BGM 在视频添加的起始位置[ugcEdit setBGMAtVideoTime:0];//设置视频声音大小[ugcEdit setVideoVolume:1.0];//设置 BGM 声音大小[ugcEdit setBGMVolume:1.0];
/*** 优点:兼容性好,支持各种操作类型的视频生成,生成的视频文件在各个平台播放的兼容性好* 缺点:生成视频速度稍慢* 调用之后在TXVideoGenerateListener里面监听结果回调* @param videoCompressed 视频压缩质量* @param videoOutputPath 视频操作之后存储路径*/- (void)generateVideo:(TXVideoCompressed)videoCompressedvideoOutputPath:(NSString *)videoOutputPath;/*** 优点:生成视频速度快* 缺点:1,剪切出来的视频在各个平台播放的兼容性稍差* 2,只有剪切和压缩操作才会使用系统函数,其他情况系统不支持,SDK内部会自动走正常视频生成的逻辑*/- (void)quickGenerateVideo:(TXVideoCompressed)videoCompressedvideoOutputPath:(NSString *)videoOutputPath;/*** 两次扫描生成视频(Two-Pass Encoding) [精简版不支持]* 优点:兼容性好,在同等码率下视频更加清晰,可以在较低码率下保持视频质量,支持各种操作类型的视频生成,生成的视频文件在各个平台播放的兼容性好* 缺点:生成视频慢*/- (void)generateVideoWithTwoPass:(TXVideoCompressed)videoCompressedvideoOutputPath:(NSString *)videoOutputPath;
typedef NS_ENUM(NSInteger, TXVideoCompressed) {// 压缩至360P分辨率VIDEO_COMPRESSED_360P = 0,// 压缩至480P分辨率VIDEO_COMPRESSED_480P = 1,// 压缩至540P分辨率VIDEO_COMPRESSED_540P = 2,// 压缩至720P分辨率VIDEO_COMPRESSED_720P = 3,// 压缩至1080P分辨率VIDEO_COMPRESSED_1080P = 4,};
setCutFromTime接口。/*** 设置视频剪裁* @param startTime 视频起始时间(s)* @param endTime 视频结束时间(s)*/- (void)setCutFromTime:(float)startTime toTime:(float)endTime;
- (void)setVideoBitrate:(int)bitrate;
setVideoFrameRate 接口可以设置视频帧率:- (void)setVideoFramerate:(TXVideoFramerateLevel)framerate;typedef NS_ENUM(NSInteger, TXVideoFramerateLevel) {// 保持原帧率VIDEO_FRAMERATE_ORIGIN = 0,// 根据视频的分辨率和码率自动选择帧率VIDEO_FRAMERATE_AUTO = -1,// 15fpsVIDEO_FRAMERATE_15FPS = 15,// 25fpsVIDEO_FRAMERATE_25FPS = 25,// 30fpsVIDEO_FRAMERATE_30FPS = 30,// 60fpsVIDEO_FRAMERATE_60FPS = 60,};
setVideoFrameRate 接口时,默认是使用视频原始帧率。文档反馈