ios上音频文件合成有多种方法,一是使用AVAssetExportSession结合AVMutableComposition,二是使用AVAssetReader和AVAssetWriter. 三是转换成pcm数据后处理pcm数据合成。
方法一和方法二在处理速度上相对来说要慢。一般3分半左右音频需要30s左右,特别是合成不同采样率的音频,速度比较慢。下文提供本人自己写的一个类,采用第三种方法合成音频,采用该算法合成的音频,比网络上一般代码提供的音频在合成效果上好。并且处理速度快,ipod touch4上处理4分半音频仅需6s左右。
//
// ExtAudioFileMixer.h
// AudioManager
//
// Created by zeng songgen on 12-8-7.
// Copyright (c) 2012年 Rumtel. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ExtAudioFileMixer : NSObject
+ (OSStatus)mixAudio:(NSString *)audioPath1
andAudio:(NSString *)audioPath2
toFile:(NSString *)outputPath
preferedSampleRate:(float)sampleRate;
@end
//
// ExtAudioFileMixer.m
// AudioManager
//
// Created by zeng songgen on 12-8-7.
// Copyright (c) 2012年 Rumtel. All rights reserved.
//
#import "ExtAudioFileMixer.h"
#import <AudioToolbox/AudioToolbox.h>
@implementation ExtAudioFileMixer
+ (OSStatus)mixAudio:(NSString *)audioPath1
andAudio:(NSString *)audioPath2
toFile:(NSString *)outputPath
preferedSampleRate:(float)sampleRate
{
OSStatus err = noErr;
AudioStreamBasicDescription inputFileFormat1;
AudioStreamBasicDescription inputFileFormat2;
AudioStreamBasicDescription converterFormat;
UInt32 thePropertySize = sizeof(inputFileFormat1);
ExtAudioFileRef inputAudioFileRef1 = NULL;
ExtAudioFileRef inputAudioFileRef2 = NULL;
ExtAudioFileRef outputAudioFileRef = NULL;
AudioStreamBasicDescription outputFileFormat;
NSURL *inURL1 = [NSURL fileURLWithPath:audioPath1];
NSURL *inURL2 = [NSURL fileURLWithPath:audioPath2];
NSURL *outURL = [NSURL fileURLWithPath:outputPath];
// Open input audio file
err = ExtAudioFileOpenURL((CFURLRef)inURL1, &inputAudioFileRef1);
if (err)
{
goto reterr;
}
assert(inputAudioFileRef1);
err = ExtAudioFileOpenURL((CFURLRef)inURL2, &inputAudioFileRef2);
if (err)
{
goto reterr;
}
assert(inputAudioFileRef2);
// Get input audio format
bzero(&inputFileFormat1, sizeof(inputFileFormat1));
err = ExtAudioFileGetProperty(inputAudioFileRef1, kExtAudioFileProperty_FileDataFormat,
&thePropertySize, &inputFileFormat1);
if (err)
{
goto reterr;
}
// only mono or stereo audio files are supported
if (inputFileFormat1.mChannelsPerFrame > 2)
{
err &#