零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods
一.前言
1.AVAsset
Assets 可以来自一个文件或用户的相册,可以理解为多媒体资源,通过 URL 作为一个 asset 对象的标识. 这个 URL 可以是本地文件路径或网络流;
2.AVAssetTrack
AVAsset 包含很多轨道 AVAssetTrack的结合,如 audio, video, text, closed captions, subtitles…
3.AVComposition / AVMutableComposition
使用 AVMutableComposition 类可以增删 AVAsset 来将单个或者多个 AVAsset 集合到一起,用来合成新视频。除此之外,若想将集合到一起的视听资源以自定义的方式进行播放,需要使用 AVMutableAudioMix 和 AVMutableVideoComposition 类对其中的资源进行协调管理;
4.AVMutableVideoComposition
AVFoundation 类 API 中最核心的类是 AVVideoComposition / AVMutableVideoComposition 。
AVVideoComposition / AVMutableVideoComposition 对两个或多个视频轨道组合在一起的方法给出了一个总体描述。它由一组时间范围和描述组合行为的介绍内容组成。这些信息出现在组合资源内的任意时间点。
AVVideoComposition / AVMutableVideoComposition 管理所有视频轨道,可以决定最终视频的尺寸,裁剪需要在这里进行;
5.AVMutableCompositionTrack
AVMutableCompositionTrack 是将多个 AVAsset 集合到一起合成新视频中轨道信息,有音频轨、视频轨等,里面可以插入各种对应的素材(画中画,水印等);
6.AVMutableVideoCompositionLayerInstruction
AVMutableVideoCompositionLayerInstruction 主要用于对视频轨道中的一个视频处理缩放、模糊、裁剪、旋转等;
7.AVMutableVideoCompositionInstruction
表示一个指令,决定一个 timeRange 内每个轨道的状态,每一个指令包含多个 AVMutableVideoCompositionLayerInstruction ;而 AVVideoComposition 由多个 AVVideoCompositionInstruction 构成;
AVVideoCompositionInstruction 所提供的最关键的一段数据是组合对象时间轴内的时间范围信息。这一时间范围是在某一组合形式出现时的时间范围。要执行的组全特质是通过其 AVMutableVideoCompositionLayerInstruction 集合定义的。
8.AVAssetExportSession
AVAssetExportSession 主要用于导出视频;
9.AVAssetTrackSegment
AVAssetTrackSegment 不可变轨道片段;
10.AVCompositionTrackSegment
AVCompositionTrackSegment 可变轨道片段,继承自 AVAssetTrackSegment;
二.简介
1.不可变对象AVCompositionTrack
AVCompositionTrack 继承自 AVAssetTrack ,该对象中的轨道,由媒体类型,轨道标识符和轨道片段组成。
2.可变对象AVMutableCompositionTrack
AVMutableCompositionTrack 继承自 AVCompositionTrack ,合成对象中的可变轨道,用于插入/移除/缩放轨道片段,而不会影响其低级别表示。
AVCompositionTrack 定义了轨道段时间对齐的约束。验证轨道是否符合合成轨道的时间规则可以使用 validateTrackSegments 函数验证;
3.轨道中插入空的时间范围
/*
*
*函数描述:在轨道中添加空白时间范围:(如果在轨道中插入空的时间范围,
* 则在插入之前的该间隔期间显示的任何媒体将立即显示。插入数据的性质
* 取决于轨道的媒体类型;例如,声道中的空时间范围呈现静音。
*
*函数参数
* timeRange : 要插入的空时间范围
*/
- (void)insertEmptyTimeRange:(CMTimeRange)timeRange;
4.插入单个音频/视频轨道
/*
*
*函数描述:在轨道中添加单个音频/视频轨道。
*
*函数参数:
* timeRange : 要插入的时间范围
* tracks:要插入的源轨,仅支持AVURLAsset实例
* startTime:由合成轨道表示的轨道出现的时间,合成轨道中第一个轨道段是kCMTimeZero
* outError:如果未成功插入track,则返回NSError
*
*返回值:如果已成功插入轨道,则为YES,否则为NO
*/
- (BOOL)insertTimeRange:(CMTimeRange)timeRange
ofTrack:(AVAssetTrack *)track
atTime:(CMTime)startTime
error:(NSError * _Nullable * _Nullable)outError;
5.插入多个音频/视频轨道
/*
*
*函数描述:在轨道中添加多个音频/视频轨道。
*
*函数参数:
* timeRanges : 包含CMTimeRange结构的NSValue对象数组,指示要插入的时间范围
* tracks:要插入的源轨,仅支持AVURLAsset实例
* startTime:由合成轨道表示的轨道出现的时间,合成轨道中第一个轨道段是kCMTimeZero
* outError:如果未成功插入track,则返回NSError
*
*返回值:如果已成功插入轨道,则为YES,否则为NO
*/
- (BOOL)insertTimeRanges:(NSArray<NSValue *> *)timeRanges
ofTracks:(NSArray<AVAssetTrack *> *)tracks
atTime:(CMTime)startTime
error:(NSError * _Nullable * _Nullable)outError
此方法等效于对每个 AVAssetTrack 调用 -insertTimeRange:ofTrack:atTime:error: 方法,如果此方法返回错误,则不会将任何时间范围插入合成轨道。
如果要指定空时间范围,请为轨道传递 NSNull 对象,并以 kCMTimeInvalid 开始时间范围,并使用所需空编辑的持续时间。
6.移除指定的时间范围
/*
*
*函数描述:在轨道中删除指定的时间范围
*
*函数参数:
* timeRange:要删除的时间范围
*
*/
- (void)removeTimeRange:(CMTimeRange)timeRange;
删除时间范围不会导致从合成中删除轨道。相反,它会删除或截断与时间范围相交的轨道段。
7.持续时间(变速)
/*
*
*函数描述:变速,更改轨迹时间范围的持续时间
*
*函数参数:
* timeRange:要缩放的轨道的时间范围
* duration:新的持续时间范围
*
*/
- (void)scaleTimeRange:(CMTimeRange)timeRange toDuration:(CMTime)duration;
8.合成轨道的轨道段
@property(nonatomic, copy) NSArray<AVCompositionTrackSegment *> *segments;
合成轨道中第一个轨道段必须是 kCMTimeZero ,并且每个后续轨道段的 target.timeRange.start 必须等于 CMTimeRangeGetEnd(target.timeRange) 。可以使用 -validateTrackSegments:error: 确保轨道段数组符合此规则。
9.验证轨道是否符合合成轨道的时间规则
/*
*函数描述:验证轨道是否符合合成轨道的时间规则
*
*返回值:符合合成轨道的时间规则返回YES,否则返回NO
*/
- (BOOL)validateTrackSegments:(NSArray<AVCompositionTrackSegment *> *)trackSegments
error:(NSError * _Nullable * _Nullable)outError;
合成轨道中第一个轨道段的 target.timeRange.start 必须是 kCMTimeZero ,并且每个后续轨道段的 target.timeRange.start 必须等于 CMTimeRangeGetEnd(target.timeRange) 。
三.使用
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:AVFoundation – AVCompositionTrack AVMutableCompositionTrack 添加移除缩放媒体音视频轨道信息
//@Time:2021/08/17 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
AVURLAsset *firstVideoAsset = [AVURLAsset URLAssetWithURL:firstVideoUrl options:nil];
AVURLAsset *secondVideoAsset = [AVURLAsset URLAssetWithURL:secondVideoUrl options:nil];
AVURLAsset *audioAsset = [AVURLAsset URLAssetWithURL:audioUrl options:nil];
//获取视听资源中的第一个 asset track
AVAssetTrack *firstVideoAssetTrack = [[firstVideoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *secondVideoAssetTrack = [[secondVideoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *audioAssetTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
//第一个视频插入的时间点是 kCMTimeZero
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstVideoAssetTrack.timeRange.duration) ofTrack:firstVideoAssetTrack atTime:kCMTimeZero error:nil];
//第二个视频插入的时间点是第一个视频结束的时间
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondVideoAssetTrack.timeRange.duration) ofTrack:secondVideoAssetTrack atTime:firstVideoAssetTrack.timeRange.duration error:nil];
//音频的持续时间是两个视频时间的总和
CMTime videoTotalDuration = CMTimeAdd(firstVideoAssetTrack.timeRange.duration, secondVideoAssetTrack.timeRange.duration);
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoTotalDuration) ofTrack: atTime:kCMTimeZero error:nil];
//导出
....
完整代码请跳转:
- 《AVComposition / AVMutableComposition 合并视频并导出》
- 《AVComposition / AVMutableComposition 合并视频并播放》
四.猜你喜欢
- AVAsset 加载媒体
- AVAssetTrack 获取视频 音频信息
- AVMetadataItem 获取媒体属性元数据
- AVAssetImageGenerator 截图
- AVAssetImageGenerator 获取多帧图片
- AVAssetExportSession 裁剪/转码
- AVPlayer 播放视频
- AVPlayerItem 管理资源对象
- AVPlayerLayer 显示视频
- AVQueuePlayer 播放多个媒体文件
- AVComposition AVMutableComposition 将多个媒体合并
- AVVideoComposition AVMutableVideoComposition 管理所有视频轨道
- AVCompositionTrack AVMutableCompositionTrack 添加移除缩放媒体音视频轨道信息
ChatGPT 3.5 国内中文镜像站免费使用啦
暂无评论内容