2010-11-24 13 views
1

iPhone用のテストアプリケーションを1つ作成しました。私は記録するために次のコードを書いた。しかし、それは動作していません。 録音できません


-(IBAction)start:(id)sender{ 
    recordSetting = [[NSMutableDictionary alloc] init]; 
    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; 
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
    [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 
    [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
    [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    soundsDirectoryPath = [documentsDirectory stringByAppendingPathComponent:@"Sounds"]; 
    [[NSFileManager defaultManager] createFileAtPath:[NSString stringWithFormat:@"%@/Test.caf", soundsDirectoryPath] contents:nil attributes:nil]; 

    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Test.caf", soundsDirectoryPath]]; 
    NSError *err = nil; 
    if([recorder isRecording]) 
    { 
     [recorder stop]; 
     recorder = nil; 
    } 
    recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err]; 
    [recorder setDelegate:self]; 
    recorder.meteringEnabled = YES; 
    if(err){ 
     NSLog(@"Error : %@", [err description]); 
    } 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    BOOL audioHWAvailable = audioSession.inputIsAvailable; 
    if (! audioHWAvailable) { 
     UIAlertView *cantRecordAlert = 
     [[UIAlertView alloc] initWithTitle: @"Warning" 
            message: @"Audio input hardware not available" 
            delegate: nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
     [cantRecordAlert show]; 
     [cantRecordAlert release]; 
     return; 
    } 
    BOOL st = [recorder prepareToRecord]; 
    if(!st){ 
     NSLog(@"Failed"); 
    } 
    recorder.meteringEnabled = YES; 
    BOOL status = [recorder record]; 
    if(!status) 
    NSLog(@"Failed"); 
} 

-(IBAction)stop:(id)sender{ 
    if([recorder isRecording]){ 
     NSLog(@"Recording..."); 
    }else{ 
     NSLog(@"Not recording..."); 
    } 
    [recorder stop]; 
} 

私は「開始」メソッドを呼び出す

、それが印刷された「失敗」「prepareToRecord」、および「記録」メソッドを呼び出した後。

「停止」メソッドを呼び出すと、「記録していません...」というメッセージが表示されます。

このコードでは間違いがあります。

ありがとうございました。

+0

また、エラーは発生しません。 – jfalexvijay

+0

スタートボタンがありますか?また、開始IBActionにログを入力して、それが入力されていることを確認する必要があります。 – DerekH

+0

私にはスタートボタンがあります。スタートボタンをクリックすると、startメソッドが呼び出されます。 .cafに.m4aを使用すると、エラーが発生します。 – jfalexvijay

答えて

2

質問のコメントに記載されている追加情報に基づいて、レコーダーに関連付けられたファイルを作成するときに問題が発生しているようです。これはprepareToRecordメソッドによって返されたNO値によって示されます。

AVAudioRecorderのinitメソッドで提供されたURLを使用して、prepareToRecordが独自の記録ファイルを作成することに注意してください。 NSFileManagerを使用するのと同じように、明示的に作成する必要はありません。

soundsDirectoryPathをログに記録し、有効なファイルパスであることを確認してください。

EDIT:実際の問題が見つかりました。ファイルを作成する前にディレクトリを作成する必要があります。このいずれかで

[[NSFileManager defaultManager] createFileAtPath:[NSString stringWithFormat:@"%@/Test.caf", soundsDirectoryPath] contents:nil attributes:nil]; 

:この行に置き換え

[[NSFileManager defaultManager] createDirectoryAtPath:soundsDirectoryPath withIntermediateDirectories:YES attributes:nil error:NULL]; 

を新しい行がディレクトリのみではなく、ファイルが作成されますが、prepareToRecord方法は、自動的にファイルが作成されますので、それは大丈夫です。

+0

パス: "file:// localhost/var/mobile/Applications/97672452-4E3E-4131-ADF5-EDE4E154754F/Documents/Sounds" soundDirectoryPath – jfalexvijay

+0

のパスは正しいです。あなたは何か考えていますか? – jfalexvijay

+0

正常に動作しています。記録後、次のステートメントが実行されると、アプリは "EXC_BAD_ACCESS"メッセージでクラッシュします。ステートメント:NSURL * url = [NSURL fileURLWithPath:[NSString stringWithFormat:@ "%@/Test.caf"、soundsDirectoryPath]]; – jfalexvijay

関連する問題