2010-08-17 5 views
0

내 아이폰 시뮬레이터에서 Audio를 녹음하고 디렉토리에 저장 한 다음 재생하려고합니다. 녹음 된 오디오를들을 수 없기 때문에 처음 녹음을하고 있는지 확실하지 않습니다. 여기 내 코드입니다 :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]; 

    } 
} 

UPDATE 1 :

playRecording의 url 변수는 항상 전무로 평가했다.

답변

2

문제는 NSURL에 제공되지 않은 유효한 URL이 필요하다는 것입니다.

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 
: 여기 NSURL stringWithURL가 좋아 유효한 URL의 경로를 수정하는 방법입니다