AVComposition

本文介绍了如何使用AVFoundation框架中的AVAsset、AVComposition等类进行音视频文件的处理与编辑,包括如何组合不同来源的音视频片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们通过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插入不同的东西时,每一个不同的东西实际上在系统中表示就是用它

211512_MopH_2814714.png

AVComposition中可以包含多个AVCompositionTrack。

转载于:https://my.oschina.net/zhengjianhua/blog/693943

### 音频文件处理的技术信息 音频文件的处理涉及多个方面,包括编码、解码以及媒体数据流的操作。以下是关于音频文件处理的一些关键技术点: #### Audio Queue Service 的功能 Audio Queue Service 提供了一种机制来简化音频播放和录制的过程,并支持自动转换[^1]。这意味着开发人员可以专注于应用程序逻辑而无需担心底层音频格式的具体细节。 #### 编解码器的支持 (仅限 Mac) 对于 macOS 平台上的开发者来说,可以通过 Audio Codec Service 来实现自定义编解码器的功能。这允许更灵活地控制音视频压缩算法的选择及其参数设置。 #### 媒体数据读取与合成 在 iOS 和 macOS 上进行多媒体编辑时, 可利用 `AVAssetReader` 结合其子类如 `AVAssetReaderAudioMixOutput` 或者 `AVAssetReaderVideoCompositionOutput`, 这些类用于提取并操作来自复杂时间线结构(`AVComposition`)中的原始样本缓冲区(sample buffers)[^2]. 通过这种方式不仅可以单独访问音频轨道还可以同时获取经过指定混音效果处理后的最终输出结果; 同样适用于视频帧序列加上视觉特效之后所形成的画面内容. ```swift let asset = AVURLAsset(url: videoFileUrl) // 创建一个资产阅读器实例. guard let reader = try? AVAssetReader(asset: asset) else { return } if let audioTrack = asset.tracks(withMediaType: .audio).first { let outputSettings: [String : Any]? = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVEncoderBitRateKey: 96000, AVNumberOfChannelsKey: 2, AVSampleRateKey: 44100.0 ] let audioReaderOutput = AVAssetReaderAudioMixOutput(audioTracks: [audioTrack], audioSettings: outputSettings) if reader.canAdd(audioReaderOutput){ reader.add(audioReaderOutput) // 开始异步读取... reader.startReading() } } ``` 上述 Swift 示例展示了如何配置基于特定音频轨道创建带预设编码选项的新输出对象 (`AVAssetReaderAudioMixOutput`). 它还演示了启动实际的数据采集过程前必要的初始化步骤. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值