AVfoundation无法在iOS中录制音频5

问题描述:

试图建立一个简单的录音功能有一些重大的麻烦,我不知道为什么。我遵循一些代码(来自这里和其他地方)建立一个非常简单的录音机和播放,但没有任何工作。我采取了从iOS 4.3起作用的示例代码,并且在我自己运行它时工作正常,但只要我将它带到iOS 5并使用ARC,就没有任何反应。该应用程序运行,但没有音频记录...任何想法都会很棒!谢谢...附上我的所有代码。我是一个新手,和我一起光着身子。这是从这里的样本代码..AVfoundation无法在iOS中录制音频5

record_audio_testViewController.h

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <CoreAudio/CoreAudioTypes.h> 

@interface record_audio_testViewController : UIViewController <AVAudioRecorderDelegate> { 

    IBOutlet UIButton * btnStart; 
    IBOutlet UIButton * btnPlay; 
    IBOutlet UIActivityIndicatorView * actSpinner; 
    BOOL toggle; 

    //Variables setup for access in the class: 
    NSURL * recordedTmpFile; 
    AVAudioRecorder * recorder; 
    NSError *__autoreleasing * error; 
    AVAudioSession * audioSession; 

} 

@property (nonatomic,retain)IBOutlet UIActivityIndicatorView * actSpinner; 
@property (nonatomic,retain)IBOutlet UIButton * btnStart; 
@property (nonatomic,retain)IBOutlet UIButton * btnPlay; 
@property (nonatomic,strong) AVAudioSession * audioSession; 
@property (nonatomic,strong) AVAudioRecorder * recorder; 

- (IBAction) start_button_pressed; 
- (IBAction) play_button_pressed; 
@end 

record_audio_testViewController.m

#import "record_audio_testViewController.h" 


@implementation record_audio_testViewController 
@synthesize actSpinner, btnStart, btnPlay, audioSession, recorder; 



/* 
// The designated initializer. Override to perform setup that is required before the view is loaded. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
    } 
    return self; 
} 
*/ 

/* 
// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
} 
*/ 



// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //Start the toggle in true mode. 
    toggle = YES; 
    btnPlay.hidden = YES; 

    //Instanciate an instance of the AVAudioSession object. 
    audioSession = [AVAudioSession sharedInstance]; 
    //Setup the audioSession for playback and record. 
    //We could just use record and then switch it to playback leter, but 
    //since we are going to do both lets set it up once. 
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: error]; 
    //Activate the session 
    [audioSession setActive:YES error: error]; 
    NSLog(@"%@",error); 

} 



/* 
// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
*/ 

- (IBAction) start_button_pressed{ 

    if(toggle) 
    { 
     toggle = NO; 
     [actSpinner startAnimating]; 
     [btnStart setTitle:@"Stop Recording" forState: UIControlStateNormal ]; 
     btnPlay.enabled = toggle; 
     btnPlay.hidden = !toggle; 

     //Begin the recording session. 
     //Error handling removed. Please add to your own code. 

     //Setup the dictionary object with all the recording settings that this 
     //Recording sessoin will use 
     //Its not clear to me which of these are required and which are the bare minimum. 
     //This is a good resource: http://www.totodotnet.net/tag/avaudiorecorder/ 
     NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init]; 
     [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey]; 
     [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
     [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 

     //Now that we have our settings we are going to instanciate an instance of our recorder instance. 
     //Generate a temp file for use by the recording. 
     //This sample was one I found online and seems to be a good choice for making a tmp file that 
     //will not overwrite an existing one. 
     //I know this is a mess of collapsed things into 1 call. I can break it out if need be. 
     recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]]; 
     NSLog(@"Using File called: %@",recordedTmpFile); 
     //Setup the recorder to use this file and record to it. 
     NSLog(@"%@",error); 
     recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:error]; 
     NSLog(@"%@",error); 
     //Use the recorder to start the recording. 
     //Im not sure why we set the delegate to self yet. 
     //Found this in antother example, but Im fuzzy on this still. 
     [recorder setDelegate:self]; 
     //We call this to start the recording process and initialize 
     //the subsstems so that when we actually say "record" it starts right away. 
     [recorder prepareToRecord]; 
     //Start the actual Recording 
     [recorder record]; 
     //There is an optional method for doing the recording for a limited time see 
     //[recorder recordForDuration:(NSTimeInterval) 10] 

    } 
    else 
    { 
     toggle = YES; 
     [actSpinner stopAnimating]; 
     [btnStart setTitle:@"Start Recording" forState:UIControlStateNormal ]; 
     btnPlay.enabled = toggle; 
     btnPlay.hidden = !toggle; 

     NSLog(@"Using File called: %@",recordedTmpFile); 
     //Stop the recorder. 
     [recorder stop]; 
    } 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

-(IBAction) play_button_pressed{ 

    //The play button was pressed... 
    //Setup the AVAudioPlayer to play the file that we just recorded. 

    AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:error]; 
    [avPlayer prepareToPlay]; 
    [avPlayer play]; 
    NSLog(@"%@",error); 

} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
    //Clean up the temp file. 
    NSFileManager * fm = [NSFileManager defaultManager]; 

    [fm removeItemAtPath:[recordedTmpFile path] error:error]; 
    //Call the dealloc on the remaining objects. 

} 



@end 

viewController.h

#import <UIKit/UIKit.h> 
#import "record_audio_testViewController.h" 


@interface ViewController : UIViewController{ 
record_audio_testViewController *audioControl; 

} 

@end 

viewController.m

#import "ViewController.h" 
#import "record_audio_testViewController.h" 


@implementation ViewController 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 
    audioControl = [[record_audio_testViewController alloc] init]; 
    [self.view addSubview:audioControl.view]; 

    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

@end 
+0

你至少应该知道哪里出了问题。你不能只发布你的所有代码,并告诉其他人修复它。 – coolcool1994 2013-07-16 21:31:02

(1)这可能无关,与你的问题,但我很惊讶,这甚至编译:

NSError *__autoreleasing * error; // ivar 
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: error]; 

这是无从说起。 error应该是一个局部变量,你应该考虑它的地址,你有没有商业标记作为自动释放:

NSError *error; 
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error]; 

(2)不要使用PlayAndRecord除非你是像在VoIP应用程序。如果您想要做的是录制,则您的音频会话策略应该是录制,并且只有在实际录制时。

我很抱歉,如果这些解决问题都没有,但他们可能是你应该首先摆脱困境的东西。

+0

谢谢..生病开始! – newkidroundtheseparts 2012-02-05 15:22:20