AVFoundation系列五:关于音视频的导出

本文详细探讨AVFoundation中的AVAssetReader和AVAssetWriter在音视频导出中的应用。介绍了AVAssetReader用于读取资源内容,AVAssetWriter用于生成资源,两者结合实现音视频的合成与导出。重点讲解了如何初始化AVAssetReader,设置输出,以及创建和配置AVAssetWriterInput。同时,强调了实时处理和非实时处理的区别,并提供了相关Demo和参考资料。
摘要由CSDN通过智能技术生成

参考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进行了音视频的分离,合成。简单的导出我们已经使用了。但是对于更高的导出需求,请使用AVAssetReaderAVAssetWriter类。

已知AVComposition 是AVAsset 的子类,我们可以对其进行操作。

AVAssetReader:要对资源(asset)的内容执行操作时,如:读取资源(asset)的音轨以产生波形的可视化表示
AVAssetWriter: 从媒体(如样本缓冲区或静态图像)生成资源(asset)

注意: 资源的读写器类不能用于实时处理。 实际上,资源的读取器甚至不能用于从HTTP实时流中实时读取数据。 但是,如果您正在使用具有实时数据源的资源编写器(例如AVCaptureOutput 对象),需要将 expectsMediaDataInRealTime属性设置为YES。对于非实时数据源,将此属性设置为YES将导致文件不正确交叉。

AVComposition 对应的组件:
AVMutableAudioMix
AVMutableVideoComposition

AVAssetReaderAVAssetReaderOutput有三个对应子类:
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。

您可以使用AVAssetReaderAudioMixOutputAVAssetReaderVideoCompositionOutput类来读取混合或合成在一起的媒体数据,分别使用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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值