ios多音频混合

本文介绍了在iOS上实现多音频混合的三种方法,包括使用AVAssetExportSession和AVMutableComposition,以及AVAssetReader和AVAssetWriter。重点推荐了一种转换为PCM数据后处理的方法,这种方法在音频合成效果和处理速度上优于其他方案,特别是在处理不同采样率的音频时,4分半钟的音频在iPod Touch 4上仅需6秒即可完成合成。
摘要由CSDN通过智能技术生成

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 &#
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值