当我们通过URL获得一个AVAseet对象后,如果想要对源文件进行处理时,我们就得用到上面提到的东西。当然,没有上面显示的那么多。但了解他们之间的关系对于我们处理文件是十分必要的。
一,扑朔迷离的关系
a、AVComposition
合成文件时,我们是先从AVAsset中获取文件。虽然操作AVAsset里面的东西,但是我们实际上使用的类比不是AVAsset。我们使用一个他的子类AVComposition,AVComposition在AVAsset上为我们提供了更加强大的服务。如同NSString和NSMutableString一样,AVComposition也有可变的对象AVMutableComposition。当我们实现不同文件组合时,我们就需要AVMutableComposition。比如实现给视频配音乐的话,就得使用AVMutableComposition。我们可以把它看做是一个用来盛放轨道的容器,里面包含不同的轨道。如MP4有一个轨道用来盛放声音,也有一个用来盛放视频(当然还有其他复杂的),然后都放在它里面。
b、AVAssetTrack
我们使用AVAssetTrack可以获得在AVAseet中源文件不同轨道上得东西。AVAssetTrack可以从AVAsset资源容器中拿到轨道信息和上面的内容。这块上代码可能更加明了
AVAssetTrack *assetTrack ; //声明一个轨道对象
//从对应asset中获取视频轨道。
assetTrack = [[[AVAsset assetWithURL:url] tracksWithMediaType:AVMediaTypeVideo] firstObject];
AVAssetTrack也有可变的,通过可变的我们可以实现拼接,将不同的视频放到一起。
self.composition = [AVMutableComposition composition]; //创建一个轨道容器
AVAssetTrack *assetTrack ; //声明一个轨道对象
//创建一个视频类型的可变轨道并放入轨道容器中
AVMutableCompositionTrack *videoTrack = [self.composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
//AVAssetTrack可以从AVAsset资源容器中拿到轨道信息和上面的内容
assetTrack = [[[AVAsset assetWithURL:url] tracksWithMediaType:AVMediaTypeVideo] firstObject];
//将AVAssetTrack中得到的资源信息插入到AVMutableCompositionTrack中。方法的完整意思为把AVAssetTrack插入AVMutableCompositionTrack中
插入的起始位置为cusorTime(CMTime时间类型),插入的长度为videoTimeRangee(CMTimeRange可以代表持续时间,里面包含一个
起始点和持续时常,在此是针对assetTrack使用的,通过它可以截取到assetTrack轨道上对应段的内容)。
[videoTrack insertTimeRange:videoTimeRangee ofTrack:assetTrack atTime:cusorTime error:nil];
c、AVCompositionTrackSegment
AVCompositionTrackSegment比较好理解。比如我们给AVMutableComposition插入不同的东西时,每一个不同的东西实际上在系统中表示就是用它
AVComposition中可以包含多个AVCompositionTrack。