TXVideoEditer.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. //
  2. // TXUGCEdit.h
  3. // TXRTMPSDK
  4. //
  5. // Created by xiang zhang on 2017/4/10.
  6. //
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import <AVFoundation/AVFoundation.h>
  10. #import <UIKit/UIKit.h>
  11. #import <CoreMedia/CoreMedia.h>
  12. #import "TXVideoEditerListener.h"
  13. #import "TXVideoEditerTypeDef.h"
  14. #import "TXVideoCustomProcessDelegate.h"
  15. ////////////////////////////////////////////////////////////////////////////////////////////////////
  16. //////////////////////////////////////////// UGC list /////////////////////////////////////////////
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////
  18. #pragma mark - 视频信息获取
  19. /// 视频信息获取类
  20. @interface TXVideoInfoReader : NSObject
  21. /**
  22. * @notice 1,如果当前image图片为nil,sdk会自动返回上一张image图片
  23. * 2,sampleProcess 回调不在主线程,如果在回调里面有UI操作,请自行切换到主线程,具体可以参考demo代码
  24. * @param number 当前采样的是第几张图片(number 从1开始)
  25. * @param image 当前采样图片
  26. * @return 是否继续获取下一张图片,YES:继续获取 NO:终止获取
  27. */
  28. typedef BOOL(^sampleProcess)(int number , UIImage * image);
  29. /** 获取视频文件信息
  30. * @param videoPath 视频文件路径
  31. */
  32. + (TXVideoInfo *)getVideoInfo:(NSString *)videoPath;
  33. /** 获取视频文件信息
  34. * @param videoAsset 视频文件属性
  35. * @return 视频信息
  36. */
  37. + (TXVideoInfo *)getVideoInfoWithAsset:(AVAsset *)videoAsset;
  38. /** 获取视频的采样图列表
  39. * @param count 获取的采样图数量(均匀采样)
  40. * @param videoPath 视频文件路径
  41. * @param sampleProcess 采样进度
  42. */
  43. + (void)getSampleImages:(int)count
  44. videoPath:(NSString *)videoPath
  45. progress:(sampleProcess)sampleProcess;
  46. /** 获取视频的采样图列表
  47. * @param count 获取的采样图数量(均匀采样)
  48. * @param videoAsset 视频文件属性
  49. * @param sampleProcess 采样进度
  50. */
  51. + (void)getSampleImages:(int)count
  52. videoAsset:(AVAsset *)videoAsset
  53. progress:(sampleProcess)sampleProcess;
  54. /** 获取视频的采样图列表
  55. * @param count 获取的采样图数量(均匀采样)
  56. * @param maxSize 缩略图的最大大小,生成的缩略图大小不会超出这个宽高
  57. * @param videoAsset 视频文件属性
  58. * @param sampleProcess 采样进度
  59. */
  60. + (void)getSampleImages:(int)count
  61. maxSize:(CGSize)maxSize
  62. videoAsset:(AVAsset *)videoAsset
  63. progress:(sampleProcess)sampleProcess;
  64. /**
  65. * 根据时间获取单帧图片
  66. * @param time 获取图片的时间
  67. * @param videoPath 视频文件路径
  68. */
  69. + (UIImage *)getSampleImage:(float)time
  70. videoPath:(NSString *)videoPath;
  71. /**
  72. * 根据时间获取单帧图片
  73. * @param time 获取图片的时间
  74. * @param videoAsset 视频AVAsset对象
  75. */
  76. + (UIImage *)getSampleImage:(float)time
  77. videoAsset:(AVAsset *)videoAsset;
  78. /**
  79. * 根据时间列表获取缩略图列表
  80. * @param asset 视频文件对象
  81. * @param times 获取的时间列表
  82. * @param maxSize 缩略图大小
  83. */
  84. + (void)getSampleImagesFromAsset:(AVAsset *)asset
  85. times:(NSArray<NSNumber*> *)times
  86. maxSize:(CGSize)maxSize
  87. progress:(sampleProcess)sampleProcess;
  88. @end
  89. ////////////////////////////////////////////////////////////////////////////////////////////////////
  90. //////////////////////////////////////////// Video/Image Edit /////////////////////////////////////
  91. ////////////////////////////////////////////////////////////////////////////////////////////////////
  92. #pragma mark - 视频编辑
  93. /// 视频编辑类
  94. @interface TXVideoEditer : NSObject
  95. /// 生成视频回调的委托对象, 可以获取生成进度与完成时间等
  96. /// @see TXVideoGenerateListener
  97. @property (nonatomic ,weak) id<TXVideoGenerateListener> generateDelegate;
  98. /// 视频预览回调的委托对象,可以获取视频的播放进度等
  99. /// @see TXVideoPreviewListener
  100. @property (nonatomic ,weak) id<TXVideoPreviewListener> previewDelegate;
  101. /// 视频画面处理的委托对象,可以获取视频画面的OpenGL纹理ID [精简版不支持]
  102. /// @see TXVideoCustomProcessListener
  103. @property (nonatomic, weak) id<TXVideoCustomProcessListener> videoProcessDelegate;
  104. /// 判断是否支持TwoPass-Encoding [精简版不支持]
  105. @property (nonatomic, readonly) BOOL supportsTwoPassEncoding;
  106. /** 默认初始化方法
  107. * @param param 编辑器画面预览参数
  108. * @see TXPreviewParam
  109. */
  110. - (instancetype)initWithPreview:(TXPreviewParam *)param;
  111. #pragma mark 视频/图片设置相关方法
  112. /// @name 视频/图片设置相关方法
  113. /** Tips:
  114. * 4.7版本以后,SDK支持图片编辑,这里需要注意的是,只能单独对图片或则视频进行编辑,暂不支持图片和视频的混合编辑。
  115. * 视频编辑暂不支持的功能:转场动画
  116. * 图片编辑暂不支持的功能:重复,倒放,快速/慢速,片尾水印, 旋转
  117. */
  118. /**
  119. * 设置视频文件路径
  120. * @param videoPath 视频文件路径
  121. * @return 0:成功;-1:视频文件不存在;-2:暂不支持2个声道以上的视频编辑;-3:传入的视频和音频的时长均为0
  122. */
  123. - (int)setVideoPath:(NSString *)videoPath;
  124. /**
  125. * 设置视频 AVAsset
  126. * @param videoAsset 视频AVAsset对象,从本地相册loading出来的视频,可以直接传入对应的视频属性,会极大的降低视频从相册loading的时间,具体请参考demo用法
  127. * @return 0 成功;
  128. * -1 视频属性asset 为nil;
  129. * -2 视频不支持:暂不支持2个声道以上的视频编辑
  130. */
  131. - (int)setVideoAsset:(AVAsset *)videoAsset;
  132. /**
  133. * 设置转场图片列表 [精简版不支持]
  134. * @param pitureList 转场图片列表,至少设置三张图片 (tips :图片最好压缩到720P以下(参考demo用法),否则内存占用可能过大,导致编辑过程异常)
  135. * @param fps 转场图片生成视频后的fps (15 ~ 30)
  136. * @return 0 设置成功;
  137. * -1 设置失败,请检查图片列表是否存在,图片数量是否大于等于3张,fps是否正常;
  138. */
  139. - (int)setPictureList:(NSArray<UIImage *> *)pitureList fps:(int)fps;
  140. /**
  141. * 设置图片转场类型 [精简版不支持]
  142. * @param transitionType 转场类型,详情见 TXTransitionType
  143. * @param duration 转场视频时长(tips:同一个图片列表,每种转场动画的持续时间可能不一样,这里可以获取转场图片的持续时长);
  144. */
  145. - (void)setPictureTransition:(TXTransitionType)transitionType duration:(void(^)(CGFloat))duration;
  146. #pragma mark 预览逻辑相关
  147. /// @name 预览逻辑相关方法
  148. /** 渲染某一时刻的视频画面
  149. * @param time 预览帧时间(s)
  150. */
  151. - (void)previewAtTime:(CGFloat)time;
  152. /** 播放某一时间段的视频
  153. * @param startTime 播放起始时间(s)
  154. * @param endTime 播放结束时间(s)
  155. */
  156. - (void)startPlayFromTime:(CGFloat)startTime
  157. toTime:(CGFloat)endTime;
  158. /**
  159. * 暂停播放
  160. */
  161. - (void)pausePlay;
  162. /// 继续播放
  163. - (void)resumePlay;
  164. /// 停止播放
  165. - (void)stopPlay;
  166. #pragma mark 特效相关
  167. // @name 特效相关方法
  168. /**
  169. * 设置美颜,美白级别 0~9
  170. * @param beautyLevel 磨皮级别 0~9
  171. * @param whiteningLevel 美白级别 0~9
  172. */
  173. - (void) setBeautyFilter:(float)beautyLevel setWhiteningLevel:(float)whiteningLevel;
  174. /**
  175. * 设置特效滤镜
  176. * @param image 滤镜图片
  177. */
  178. - (void) setFilter:(UIImage *)image;
  179. /**
  180. * 设置两个滤镜效果
  181. * @param leftFilter 左滤镜图片(nil代表无左滤镜)
  182. * @param leftIntensity 左滤镜浓度
  183. * @param rightFilter 右滤镜图片(nil代表无右滤镜)
  184. * @param rightIntensity 右滤镜浓度
  185. * @param leftRatio 左滤镜所占比例
  186. */
  187. - (void)setFilter:(UIImage*)leftFilter leftIntensity:(CGFloat)leftIntensity rightFilter:(UIImage*)rightFilter rightIntensity:(CGFloat)rightIntensity leftRatio:(CGFloat)leftRatio;
  188. /**
  189. * 设置滤镜效果程度
  190. * @param specialRatio 从0到1,越大滤镜效果越明显,默认取值0.5
  191. */
  192. -(void) setSpecialRatio:(float)specialRatio;
  193. /**
  194. * 设置倒放 [精简版不支持]
  195. * @param isReverse 是否倒放
  196. */
  197. - (void) setReverse:(BOOL)isReverse;
  198. /**
  199. * 设置重复播放 [精简版不支持]
  200. * @param repeatList 重复播放的范围列表
  201. * @see TXRepeat
  202. */
  203. - (void) setRepeatPlay:(NSArray<TXRepeat *> *)repeatList;
  204. /**
  205. * 设置画面渲染角度 [精简版不支持]
  206. * @param rotation 画面渲染角度, 必须是90的倍数
  207. * @warning 只支持视频旋转
  208. */
  209. - (void)setRenderRotation:(int)rotation;
  210. /**
  211. * 设置视频加速播级别 [精简版不支持]
  212. * @param speedList 加速范围列表
  213. */
  214. - (void) setSpeedList:(NSArray<TXSpeed *> *)speedList;
  215. /**
  216. * 开始特效 [精简版不支持]
  217. * @param type 特效类型
  218. * @param startTime 特效开始时间
  219. */
  220. - (void) startEffect:(TXEffectType)type startTime:(float)startTime;
  221. /**
  222. * 结束特效 [精简版不支持]
  223. * @param type 特效类型
  224. * @param endTime 特效结束时间
  225. */
  226. - (void) stopEffect:(TXEffectType)type endTime:(float)endTime;
  227. /**
  228. * 删除最后一个添加的特效 [精简版不支持]
  229. */
  230. - (void) deleteLastEffect;
  231. /**
  232. * 删除所有特效 [精简版不支持]
  233. */
  234. - (void) deleteAllEffect;
  235. #pragma mark 贴纸相关
  236. /// @name 贴纸相关方法 [精简版不支持]
  237. /**
  238. * 设置字幕(气泡)列表 [精简版不支持]
  239. * @param subtitleList 字幕列表
  240. */
  241. - (void) setSubtitleList:(NSArray<TXSubtitle *> *)subtitleList;
  242. /**
  243. * 设置静态贴纸 [精简版不支持]
  244. * @param pasterList 静态贴纸列表
  245. */
  246. - (void) setPasterList:(NSArray<TXPaster *> *)pasterList;
  247. /**
  248. * 设置动图列表 [精简版不支持]
  249. * @param animatedPasterList 动态贴纸列表
  250. */
  251. - (void) setAnimatedPasterList:(NSArray<TXAnimatedPaster *> *)animatedPasterList;
  252. #pragma mark BGM相关
  253. /// @name BGM相关方法
  254. /**
  255. * 设置背景音乐 [精简版不支持]
  256. * @param path 音乐文件路径
  257. * @param result 0:成功, -1:音乐文件格式不支持
  258. */
  259. - (void) setBGM:(NSString *)path result:(void(^)(int))result;
  260. /**
  261. * 设置背景音乐 [精简版不支持]
  262. * @param asset 音乐AVAsset对象, 从系统媒体库loading出来的音乐,可以直接传入对应的音乐属性,会极大的降低音乐从系统媒体库loading的时间,具体请参考demo用法
  263. * @param result 0:成功, -1:音乐文件格式不支持
  264. */
  265. - (void) setBGMAsset:(AVAsset *)asset result:(void(^)(int))result;
  266. /**
  267. * 设置背景音乐的起始时间和结束时间 [精简版不支持]
  268. * @param startTime 音乐起始时间
  269. * @param endTime 音乐结束时间
  270. */
  271. - (void) setBGMStartTime:(float)startTime endTime:(float)endTime;
  272. /**
  273. * 设置背景音乐是否循环播放 [精简版不支持]
  274. * @param isLoop 是否循环播放
  275. */
  276. - (void) setBGMLoop:(BOOL)isLoop;
  277. /**
  278. * 设置背景音乐在视频的添加的起始位置 [精简版不支持]
  279. * @param time 背景音乐在视频的添加的起始时间
  280. */
  281. - (void) setBGMAtVideoTime:(float)time;
  282. /**
  283. * 设置视频声音大小 [精简版不支持]
  284. * @param volume 音量, 取值范围 0.0 ~ 1.0
  285. */
  286. - (void) setVideoVolume:(float)volume;
  287. /**
  288. * 设置背景音乐声音大小 [精简版不支持]
  289. * @param volume 背景音量, 取值范围 0.0 ~ 1.0
  290. */
  291. - (void) setBGMVolume:(float)volume;
  292. /**
  293. * 设置背景音淡入淡出
  294. * @param fadeInDuration 淡入持续时长 (s)
  295. * @param fadeOutDuration 淡出持续时长 (s)
  296. */
  297. - (void) setBGMFadeInDuration:(float)fadeInDuration fadeOutDuration:(float)fadeOutDuration;
  298. #pragma mark 水印相关
  299. /// @name 水印相关方法
  300. /**
  301. * 设置全局水印 [精简版不支持]
  302. * @param waterMark 全局水印图片
  303. * @param normalizationFrame 水印相对于视频图像的归一化frame,x,y,width,height 取值范围 0~1;
  304. * height不用设置,sdk内部会根据水印宽高比自动计算height;
  305. * 比如视频图像大小为(540,960) frame设置为(0.1,0.1,0.1,0),
  306. * 水印的实际像素坐标为(540 * 0.1,960 * 0.1,540 * 0.1 ,540 * 0.1 * waterMark.size.height / waterMark.size.width)
  307. */
  308. - (void) setWaterMark:(UIImage *)waterMark normalizationFrame:(CGRect)normalizationFrame;
  309. /**
  310. * 设置片尾水印 [精简版不支持]
  311. * @param tailWaterMark 片尾水印图片
  312. * @param normalizationFrame 水印相对于视频图像的归一化frame,x,y,width,height 取值范围 0~1;
  313. * height不用设置,sdk内部会根据水印宽高比自动计算height;
  314. * 比如视频图像大小为(540,960) frame设置为(0.1,0.1,0.1,0),
  315. * 水印的实际像素坐标为(540 * 0.1,960 * 0.1,540 * 0.1 ,540 * 0.1 * waterMark.size.height / waterMark.size.width)
  316. * @param duration 水印的持续时长
  317. */
  318. - (void) setTailWaterMark:(UIImage *)tailWaterMark normalizationFrame:(CGRect)normalizationFrame duration:(CGFloat)duration;
  319. #pragma mark 视频生成相关
  320. /// @name 视频生成相关方法
  321. /**
  322. * 设置视频剪裁
  323. * @param startTime 视频起始时间
  324. * @param endTime 视频结束时间
  325. */
  326. - (void) setCutFromTime:(float)startTime toTime:(float)endTime;
  327. /**
  328. * 设置视频码率
  329. * @param bitrate 视频码率 单位:kbps
  330. * 如果设置了码率,SDK生成视频会优先使用这个码率,注意码率不要太大或则太小,码率太小视频会模糊不清,码率太大,生成视频体积会很大
  331. * 这里建议设置范围为:600~12000,如果没有调用这个接口,SDK内部会根据压缩质量自动计算码率
  332. */
  333. - (void) setVideoBitrate:(int)bitrate;
  334. /**
  335. * 生成视频
  336. * 优点:兼容性好,支持各种操作类型的视频生成,生成的视频文件在各个平台播放的兼容性好
  337. * 缺点:生成视频速度稍慢
  338. * 调用之后在TXVideoGenerateListener里面监听结果回调
  339. * @param videoCompressed 视频压缩质量
  340. * @param videoOutputPath 视频操作之后存储路径
  341. *
  342. */
  343. - (void) generateVideo:(TXVideoCompressed)videoCompressed videoOutputPath:(NSString *)videoOutputPath;
  344. /**
  345. * 使用系统函数快速生成视频
  346. * 优点:生成视频速度快
  347. * 缺点:1,剪切出来的视频在各个平台播放的兼容性稍差
  348. * 2,只有剪切和压缩操作才会使用系统函数,其他情况系统不支持,SDK内部会自动走正常视频生成的逻辑
  349. * 调用之后在 TXVideoGenerateListener 里面监听结果回调
  350. * @param videoCompressed 视频压缩质量
  351. * @param videoOutputPath 视频操作之后存储路径
  352. */
  353. - (void) quickGenerateVideo:(TXVideoCompressed)videoCompressed videoOutputPath:(NSString *)videoOutputPath;
  354. /**
  355. * 两次扫描生成视频(Two-Pass Encoding) [精简版不支持]
  356. * 优点:兼容性好,在同等码率下视频更加清晰,可以在较低码率下保持视频质量,支持各种操作类型的视频生成,生成的视频文件在各个平台播放的兼容性好
  357. * 缺点:生成视频慢
  358. * 调用之后在TXVideoGenerateListener里面监听结果回调
  359. * @param videoCompressed 视频压缩质量
  360. * @param videoOutputPath 视频操作之后存储路径
  361. */
  362. - (void) generateVideoWithTwoPass:(TXVideoCompressed)videoCompressed videoOutputPath:(NSString *)videoOutputPath;
  363. /**
  364. 暂停视频生成,仅适用于generateVideo,quickGenerateVideo调用无效
  365. @discussion
  366. SDK生成视频默认采用的是硬编码(编码效率高,编码出来的图像效果好),硬编码器在程序进后台后会停止工作,从而导致视频生成失败,
  367. 这里新增了两个接口pauseGenerate,resumeGenerate,程序进后台后您可以调用pauseGenerate暂停视频生成,程序重新进前台后,
  368. 您可以调用resumeGenerate 继续视频生成,这里需要注意的是,调用resumeGenerate,sdk会重启硬编码器,会有一定的概率重启失败,
  369. 或则重启后前几帧数据编码失败,这个时候SDK内部会在 TXVideoGenerateListener 抛出编码错误事件,收到错误事件后您需要重新生成视频。
  370. @see resumeGenerate
  371. */
  372. - (void) pauseGenerate;
  373. /**
  374. * 继续视频生成,仅适用于generateVideo,quickGenerateVideo调用无效
  375. * @see pauseGenerate
  376. */
  377. - (void) resumeGenerate;
  378. /**
  379. * 停止视频文件生成
  380. */
  381. - (void) cancelGenerate;
  382. @end
  383. #pragma mark - 视频合成、拼接
  384. /// 视频合成与拼接, 可以进行画中画合成或者前后拼接 [精简版不支持]
  385. @interface TXVideoJoiner : NSObject
  386. /// 合成的回调委托对象
  387. /// @see TXVideoJoinerListener
  388. @property (nonatomic ,weak) id<TXVideoJoinerListener> joinerDelegate;
  389. /// 预览的回调委托对象
  390. /// @see TXVideoPreviewListener
  391. @property (nonatomic ,weak) id<TXVideoPreviewListener> previewDelegate;
  392. /** 初始化 TXVideoJoiner ,如果您不需要预览,param 可以设置为nil
  393. * @param param 参考 TXPreviewParam
  394. */
  395. - (instancetype)initWithPreview:(TXPreviewParam *)param;
  396. /** 设置视频文件列表 app本地的视频文件建议使用这个接口
  397. * @param videoPathList 视频路径列表
  398. * @return 0 成功;
  399. * -1 视频列表文件不存在
  400. * -2 视频列表里面有一个或则几个视频不存在
  401. * -3 视频列表里面有不支持合成的视频 (声道数>2暂不支持合成)
  402. */
  403. - (int)setVideoPathList:(NSArray *)videoPathList;
  404. /** 设置视频文件列表 相册的视频文件建议使用这个接口
  405. * @param videoAssetList 视频AVAsset对象列表,从本地相册loading出视频列表后,可以直接传入对应的视频属性列表,会极大的降低视频从相册loading的时间,具体请参考demo用法
  406. * @return 0 成功;
  407. * -1 视频属性asset列表不存在
  408. * -2 视频列表里面有一个或则几个视频不存在
  409. * -3 视频列表里面有不支持合成的视频 (声道数>2暂不支持合成)
  410. */
  411. - (int)setVideoAssetList:(NSArray<AVAsset *> *)videoAssetList;
  412. /// 开启视频播放,会从视频的起始位置开始播放 (需要在setVideoPathList之后调用)
  413. - (void)startPlay;
  414. /// 暂停播放
  415. - (void)pausePlay;
  416. /// 继续播放
  417. - (void)resumePlay;
  418. /// 停止播放
  419. - (void)stopPlay;
  420. /** 合成视频
  421. * SDK内部会自动判断视频是否可以快速合成,如果可以,会优先走快速合成逻辑
  422. * 调用后在TXVideoComposeListener里面监听结果回调
  423. * @param videoCompressed 视频压缩质量
  424. * @param videoOutputPath 生成新的视频存储路径
  425. */
  426. - (void)joinVideo:(TXVideoCompressed)videoCompressed videoOutputPath:(NSString *)videoOutputPath;
  427. /*
  428. *注意:当前接口已经被废弃,请使用 joinVideo 接口,SDK内部会自动判断视频是否具有快速合成的条件
  429. */
  430. //- (void)quickJoinVideo:(TXVideoCompressed)videoCompressed videoOutputPath:(NSString *)videoOutputPath;
  431. /** 设置分屏合成坐标
  432. * 使用方法详见demo示例
  433. * @param rects 需要合成视频的坐标
  434. * @param canvasWidth 画布宽度,也是分屏合成之后视频的宽度
  435. * @param canvasHeight 画布高度,也是分屏合成之后视频的高度
  436. */
  437. - (void)setSplitScreenList:(NSArray <NSValue *> *)rects canvasWidth:(int)canvasWidth canvasHeight:(int)canvasHeight;
  438. /** 分屏合成
  439. * @param videoCompressed 视频压缩质量
  440. * @param videoOutputPath 生成新的视频存储路径
  441. */
  442. - (void)splitJoinVideo:(TXVideoCompressed)videoCompressed videoOutputPath:(NSString *)videoOutputPath;
  443. /// 停止视频文件合成
  444. - (void)cancelJoin;
  445. @end