AVAssetReader 和 AVAssetWriter类提供的低级功能,能处理更复杂的媒体样本。
AVAssetReader 和 AVAssetWriter
AVAssetReader
AVAssetReader 用于从 AVAsset示例中读取媒体样本。
通常会配置一个或多个AVAssetReaderOutput实例,并通过 copyNextSampleBuffer 方法访问音频和视频帧。
一个资源读取器的内部通道都是以多线程的方式不断提取下一个可用样本的。这样可以在系统请求资源时最小化时延。
AVAssetWriter
AVAssetWriter 用于对媒体资源进行编码并将其写入到容器文件中(如MPEG-4)。
通常由一个或多个AVAssetWriterInput对象配置,用于附加将包含要写入容器的媒体样本的CMSampleBuffer对象。
AVAssetWriter可用于实时操作和离线操作两种:
- 实时。当处理实时资源时,比如从AVCaptureVideoDataOutput写入捕捉样本时,AVAssetWriterInput应该令expectsMediaDataInRealTime属性为YES类确保readyForMoreMediaData(指示保持数据样本交错的情况下是否可以附加更多信息)值被正确计算。
- 离线。当从离线资源中读取媒体资源时,比如从AVAssetReader读取样本buffer,仍然需要readyForMoreMediaData,再可以使用requestMediaDataWhenReadyOnQueue:usingBlock方法来控制数据的提供。
创建波形图
创建波形需要
读取:读取音频样本进行渲染,需要读取或者解压音频数据。
缩减:读取到的样本远比我们需要的多,可以将样本分成小的样本块,并在每个样本块上找到最大值最小值和平均值。
渲染:将缩减后的样本呈现在屏幕上。
读取
使用AVAssetReader实例从AVAsset中读取音频样本并返回一个NSData对象
1 | //载入资源,读取asset样本 |
1 | + (NSData *)readAudioSamplesFromAsset:(AVAsset *)asset { |
缩减音频样本
处理带有音频信息的NSData对象,根据指定的大小,将样本分成一个个样本块,找到样本块中的最大样本,得到筛选结果。
1 | - (NSArray *)filteredSamplesForSize:(CGSize)size { |
1 | //找到样本块中的最大绝对值 |
渲染音频样本
创建UIView子类, 使用QuartzCore渲染筛选后的结果
1 | - (void)drawRect:(CGRect)rect { |