2010-08-17 5 views
0

J'essaie d'enregistrer de l'audio depuis mon simulateur IPhone, puis de l'enregistrer dans le répertoire puis de le lire. Puisque je ne peux pas entendre mon enregistrement audio, je ne suis même pas sûr si c'est en train d'enregistrer en premier lieu. Voici mon code:Enregistrement et lecture audio dans la programmation IPhone

-(IBAction) playRecording:sender 
{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *dir = [paths objectAtIndex:0]; 

    NSFileManager *filemanager = [NSFileManager defaultManager]; 

    NSArray *files = [filemanager contentsOfDirectoryAtPath:dir error:nil]; 

    NSString *file = [files objectAtIndex:0]; 

    NSString *path = [dir stringByAppendingPathComponent:file]; 

    NSURL *url = [NSURL URLWithString:path]; // url is nil 

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 

    player.volume = 0.3; 

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

    [player play]; 


} 


-(IBAction) record:sender 
{ 
    if(recorder.recording) 
    { 
     [recorder stop]; 

     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient error:nil]; 

     [recordButton setTitle:@"Record" forState:UIControlStateNormal]; 

    } 

    else 
    { 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

     NSString *dir = [paths objectAtIndex:0]; 
     NSString *filename = [[NSString alloc] initWithString:@"myfile.caf"]; 

     NSString *path = [dir stringByAppendingPathComponent:filename]; 

     NSMutableDictionary *settings = [[NSMutableDictionary alloc] init]; 

     [settings setValue:[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey:AVFormatIDKey]; 

     [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 

     [settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey]; 

     [settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 

     [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 

     [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; 

     [recorder release]; 

     recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:path] 
    settings:settings error:nil]; 

     [recorder prepareToRecord]; 
     recorder.meteringEnabled = YES; 
     [recorder record]; 

     [recordButton setTitle:@"Stop" forState:UIControlStateNormal]; 

    } 
} 

MISE À JOUR 1:

La variable url dans playRecording toujours évalué à zéro.

Répondre

2

Le problème était que le NSURL attend une URL valide qui n'a pas été fournie. Voici un moyen de fixer le chemin d'accès à une URL valide qui NSURL stringWithURL aime:

NSString *path = [dir stringByAppendingPathComponent:file]; 

NSString *fixedPath = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

NSURL *url = [NSURL URLWithString:fixedPath]; 

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 

player.volume = 0.3; 

[player play]; 
1
#import "RecorderController.h" 

#import <Foundation/Foundation.h> 
#import <AudioToolbox/AudioToolbox.h> 

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] 

@implementation RecorderController 

@synthesize _recordButton; 
@synthesize _recorder; 

- (void)awakeFromNib { 

    NSError *err = nil; 

    NSMutableDictionary *recordSetting; 
    recordSetting = [[NSMutableDictionary alloc] init]; 

    [recordSetting setValue: [NSNumber numberWithInt: kAudioFormatLinearPCM] forKey: AVFormatIDKey]; 
    [recordSetting setValue: [NSNumber numberWithFloat: 44100.0] forKey: AVSampleRateKey]; 
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey: AVNumberOfChannelsKey]; 

    [recordSetting setValue: [NSNumber numberWithInt: 16] forKey: AVLinearPCMBitDepthKey]; 
    [recordSetting setValue: [NSNumber numberWithBool: NO] forKey: AVLinearPCMIsBigEndianKey]; 
    [recordSetting setValue: [NSNumber numberWithBool: NO] forKey: AVLinearPCMIsFloatKey]; 

    // create a new dated file 
    NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0]; 
    NSString *caldate = [now description]; 
    NSString *recorderFilePath; 
    //recorderFilePath = [[NSString stringWithFormat:@"%@/%@.wav", DOCUMENTS_FOLDER, caldate] retain]; 
    recorderFilePath = [[NSString stringWithFormat:@"%@/SeasonsGreetings.wav", DOCUMENTS_FOLDER, caldate] retain]; 


    NSURL *url = [NSURL fileURLWithPath:recorderFilePath]; 
    NSLog(@"PATH: %@",url); 
    err = nil; 
    _recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err]; 

    if(!_recorder){ 
    NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    UIAlertView *alert = 
    [[UIAlertView alloc] initWithTitle: @"Warning" 
           message: [err localizedDescription] 
           delegate: nil 
        cancelButtonTitle:@"OK" 
        otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    return; 
    } 

    // prepare to record 
    [_recorder setDelegate:self]; 
    [_recorder prepareToRecord]; 

} 

- (IBAction)recordButtonPressed:(UIButton *)sender { 
    NSLog(@"Record button pressed"); 

    [_recorder record]; 
} 

@end 
Questions connexes