参考Apple:AVFoundation Programming Guide
本文参考简书:https://www.jianshu.com/p/a5d3ec793597
AVFoundation系列四:如何配置一个合格的Camera
AVFoundation系列三:音视频编辑
AVFoundation系列二:用AVPlayer播放视频
AVFoundation系列一:AVAsset的使用方法
在音视频编辑中,重要的是AVComposition的管理,对这个超类进行细分为:
引用: AVFoundation系列三:音视频编辑 中的片段:
1.对与音频来讲,AVMutableAudioMix可以用来控制音频的表现形式,2.AVMutableAudioMixInputParaments是先关参数;
3.对于视频来讲,AVMutableVideoComposition是设置视频的解释器,其中4.AVMutableVideoCompositionIntruments是参数说明,5.AVMutableVideoCompositionLayerInstruments是图层变换的表现形式指定,
6.AVMutableCompositionCoreAnimationTool是用于图层的animation动画,涉及layer,似乎如果我们想要加水印,就要对这个进行处理
在音视频导出中重要的就是:AVAssetExportSession
,早在 AVFoundation系列一:AVAsset的使用方法 中的Demo中就已经使用过AVAssetExportSession
进行了音视频的分离,合成。简单的导出我们已经使用了。但是对于更高的导出需求,请使用AVAssetReader
和AVAssetWriter
类。
已知AVComposition
是AVAsset 的子类,我们可以对其进行操作。
AVAssetReader:要对资源(asset)的内容执行操作时,如:读取资源(asset)的音轨以产生波形的可视化表示
AVAssetWriter: 从媒体(如样本缓冲区或静态图像)生成资源(asset)
注意: 资源的读写器类不能用于实时处理。 实际上,资源的读取器甚至不能用于从HTTP实时流中实时读取数据。 但是,如果您正在使用具有实时数据源的资源编写器(例如AVCaptureOutput 对象),需要将 expectsMediaDataInRealTime属性设置为YES。对于非实时数据源,将此属性设置为YES将导致文件不正确交叉。
与AVComposition
对应的组件:
AVMutableAudioMix
与
AVMutableVideoComposition
在AVAssetReader
中AVAssetReaderOutput
有三个对应子类:
AVAssetReaderTrackOutput
,
AVAssetReaderAudioMixOutput
AVAssetReaderVideoCompositionOutput
正如文中所说:每个AVAssetReader对象一次只能与单个资源相关联,此资源可能包含多个轨道
如果你了解了AVComposition
,你就会明白,除了音频轨道,视频轨道,还有其他的诸如:字幕轨道等。
以上是极简介绍。如果你读懂了,将会有助于你理解下边的实现代码。
下面我们开始接触 AVAssetExportSession
为了详细一点,我会列出代码:
初始化一个AVAssetReader:
NSError *outError;
AVAsset *someAsset = <#AVAsset that you want to read#>;
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:someAsset error:&outError];
BOOL success = (assetReader != nil);
读取轨道信息:
AVAsset *localAsset = assetReader.asset;
// Get the audio track to read.
AVAssetTrack *audioTrack = [[localAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
添加AVAssetReaderOutput输出:
// Decompression settings for Linear PCM
NSDictionary *decompressionAudioSettings = @{
AVFormatIDKey : [NSNumber numberWithUnsignedInt:kAudioFormatLinearPCM] };
// Create the output with the audio track and decompression settings.
AVAssetReaderOutput *trackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:decompressionAudioSettings];
// Add the output to the reader if possible.
if ([assetReader canAddOutput:trackOutput])
[assetReader addOutput:trackOutput];
decompressionAudioSettings中kAudioFormatLinearPCM 是想将音轨中的数据以PCM的格式读取出来
注意:要以存储格式从特定资源轨道读取媒体数据,请将outputSettings参数设置为nil。
您可以使用AVAssetReaderAudioMixOutput
和AVAssetReaderVideoCompositionOutput
类来读取混合或合成在一起的媒体数据,分别使用AVAudioMix
对象或AVVideoComposition
对象。 通常,当您的资源读取器从AVComposition
对象读取时,将使用这些输出
使用AVAssetReaderAudioMixOutput
的方式如下:
AVAudioMix *audioMix = <#An AVAudioMix that specifies how the audio tracks from the AVAsset are mixed#>;
// Assumes that assetReader was initialized with an AVComposition object.
AVComposition *composition = (AVComposition *)assetReader.asset;
// Get the audio tracks to read.
NSArray