iPhone – 如何将.cafaudio文件转换成.aac?
我正在录音。 我能够录制我的audiocaf(核心audio格式).i按照本教程AVAudioRecorder录制iPhone上的audio 。 现在我不想以.aac格式直接录制声音,我需要将录制的.cafaudio文件转换为.aacaudio文件…任何想法如何做到这一点?
#import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface recordViewController : UIViewController <AVAudioRecorderDelegate, AVAudioPlayerDelegate> { AVAudioRecorder *audioRecorder; AVAudioPlayer *audioPlayer; UIButton *playButton; UIButton *recordButton; UIButton *stopButton; } @property (nonatomic, retain) IBOutlet UIButton *playButton; @property (nonatomic, retain) IBOutlet UIButton *recordButton; @property (nonatomic, retain) IBOutlet UIButton *stopButton; -(IBAction) recordAudio; -(IBAction) playAudio; -(IBAction) stop; @end #import "recordViewController.h" @implementation recordViewController @synthesize playButton, stopButton, recordButton; - (void)viewDidLoad { [super viewDidLoad]; playButton.enabled = NO; stopButton.enabled = NO; NSArray *dirPaths; NSString *docsDir; dirPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound.caf"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey, [NSNumber numberWithInt:16], AVEncoderBitRateKey, [NSNumber numberWithInt: 2], AVNumberOfChannelsKey, [NSNumber numberWithFloat:44100.0], AVSampleRateKey, nil]; NSError *error = nil; audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error]; if (error) { NSLog(@"error: %@", [error localizedDescription]); } else { [audioRecorder prepareToRecord]; } } -(void) recordAudio { if (!audioRecorder.recording) { playButton.enabled = NO; stopButton.enabled = YES; [audioRecorder record]; } } -(void)stop { stopButton.enabled = NO; playButton.enabled = YES; recordButton.enabled = YES; if (audioRecorder.recording) { [audioRecorder stop]; } else if (audioPlayer.playing) { [audioPlayer stop]; } } -(void) playAudio { if (!audioRecorder.recording) { stopButton.enabled = YES; recordButton.enabled = NO; if (audioPlayer) [audioPlayer release]; NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioRecorder.url error:&error]; audioPlayer.delegate = self; if (error) NSLog(@"Error: %@", [error localizedDescription]); else [audioPlayer play]; } } -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { recordButton.enabled = YES; stopButton.enabled = NO; } -(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error { NSLog(@"Decode Error occurred"); } -(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag { } -(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error { NSLog(@"Encode Error occurred"); } @end
尝试这个
步骤1)我从https://github.com/michaeltyson/TPAACAudioConverter下载了示例TPAACAudioConverter项目
步骤2) AACConverterViewController.m
我已经设置了源文件和目标文件格式
- (IBAction)convert:(id)sender { if ( ![TPAACAudioConverter AACConverterAvailable] ) { [[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Converting audio", @"") message:NSLocalizedString(@"Couldn't convert audio: Not supported on this device", @"") delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", @""), nil] autorelease] show]; return; } // Initialise audio session, and register an interruption listener, important for AAC conversion if ( !checkResult(AudioSessionInitialize(NULL, NULL, interruptionListener, self), "initialise audio session") ) { [[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Converting audio", @"") message:NSLocalizedString(@"Couldn't initialise audio session!", @"") delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", @""), nil] autorelease] show]; return; } // Set up an audio session compatible with AAC conversion. Note that AAC conversion is incompatible with any session that provides mixing with other device audio. UInt32 audioCategory = kAudioSessionCategory_MediaPlayback; if ( !checkResult(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "setup session category") ) { [[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Converting audio", @"") message:NSLocalizedString(@"Couldn't setup audio category!", @"") delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", @""), nil] autorelease] show]; return; } NSArray *documentsFolders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); audioConverter = [[[TPAACAudioConverter alloc] initWithDelegate:self source:[[NSBundle mainBundle] pathForResource:@"audio" ofType:@"aiff"] destination:[[documentsFolders objectAtIndex:0] stringByAppendingPathComponent:@"audio.m4a"]] autorelease]; ((UIButton*)sender).enabled = NO; [self.spinner startAnimating]; self.progressView.progress = 0.0; self.progressView.hidden = NO; [audioConverter start]; }
播放转换的audio
- (IBAction)playConverted:(id)sender { if ( audioPlayer ) { [audioPlayer stop]; [audioPlayer release]; audioPlayer = nil; [(UIButton*)sender setTitle:@"Play converted" forState:UIControlStateNormal]; } else { NSArray *documentsFolders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[documentsFolders objectAtIndex:0] stringByAppendingPathComponent:@"audio.aac"]; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; [audioPlayer play]; [(UIButton*)sender setTitle:@"Stop" forState:UIControlStateNormal]; } }
步骤3) TPAACAudioConverter.m
只是我已经改变了audio文件types查找并将kAudioFileM4ATypereplace为kAudioFileAAC_ADTSType