iOS - запись звука с помощью AVAudioRecorder завершается без ошибок - PullRequest
3 голосов
/ 03 апреля 2012

У меня проблема с AVAudioRecorder, который у меня не работает, по крайней мере из того, что я вижу (или не слышу).

Я использую ARC для iOS 5.

Я установил объекты ошибок, но ни один из них не был запущен, так что, я думаю, я что-то здесь не так делаю.

Вот часть, где я установил AVAudioRecorder:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:currentTrack.trackFileName];

currentTrack.trackFileURL = [NSURL fileURLWithPath:soundFilePath];

NSLog(@"Chemin : %@", currentTrack.trackFileURL.path);

NSMutableDictionary *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];


currentTrack.trackRecordSettings = recordSetting;


NSError *err = nil;


//[audioSession setDelegate:self];
if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
}
[[AVAudioSession sharedInstance] setActive:YES error:&err];
err = nil;
if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
}
err = nil;
recorder = [[AVAudioRecorder alloc]
                 initWithURL:currentTrack.trackFileURL
                 settings:currentTrack.trackRecordSettings
                 error:&error];

if (err)
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning"
                               message: [err localizedDescription]
                              delegate: nil
                     cancelButtonTitle:@"OK"
                     otherButtonTitles:nil];
    [alert show];
    NSLog(@"error: %@", [error localizedDescription]);

} else {
    [recorder setDelegate:self];
    [recorder prepareToRecord];

    BOOL audioHWAvailable = [[AVAudioSession sharedInstance]inputIsAvailable ];
    if (!audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: @"Audio input hardware not available"
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [cantRecordAlert show]; 
        return;
    }
}

Здесь нет ошибки

Затем, когда пришло время начать запись:

-(void)startRecordingAudio{
    NSLog(@"Start recording");
    [[AVAudioSession sharedInstance] setCategory :AVAudioSessionCategoryRecord error:nil];
    [recorder record];
}

Затем, когда пришло время остановить запись:

-(void)stopRecordingAudio{
    NSLog(@"Stop recording");
    [recorder stop];
    NSError *err;
    NSData *audioData = [NSData dataWithContentsOfFile:currentTrack.trackFileURL.path options: 0 error:&err];
    if(!audioData)
        NSLog(@"audio data error: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    NSLog(@"%d", audioData.length);
    }

Это нормально, что длина аудио-данных всегда равна 4096? Если я правильно понимаю, это около 93 мс звука ...

Наконец, когда пришло время воспроизвести записанный звук:

-(void)startPlayingAudio{
    [[AVAudioSession sharedInstance] setCategory :AVAudioSessionCategoryPlayback error:nil];

    NSLog(@"Start playing");
    NSError *error;
    if(player == nil){
        player = [[AVAudioPlayer alloc] initWithContentsOfURL:currentTrack.trackFileURL    
        error:&error];                                                                           
    }


    player.delegate = self;

    if (error)
        NSLog(@"Error: %@", 
              [error localizedDescription]);
    else
        [player  play];
}

Я настроил методы делегата, которые тоже никогда не запускаются:

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
   NSLog (@"audioRecorderDidFinishRecording:successfully:");
}
-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{
    NSLog(@"Decode Error occurred");
}
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:    (BOOL)flag
{
    NSLog (@"audioRecorderDidFinishRecording:successfully: %d", flag);
}
-(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error
{
    NSLog(@"Encode Error occurred");
}
-(void)beginInterruption{
    NSLog(@"INTERRUPT");
}

Кроме того, я увидел, что файл .caf правильно создан в папке с документами моего приложения.

Спасибо за любую помощь, которую вы можете принести. На данный момент я не слышу записанный звук и тестирую его на устройстве iPhone 4 без наушников.

1 Ответ

0 голосов
/ 03 апреля 2012

Нашел проблему: запись была вызвана до того как подготовить запись. Поскольку я использовал viewDidAppear для настройки записи, звонок для начала записи был сделан до того, как вид был виден ...

Я использовал viewDidAppear, потому что viewDidLoad не вызывается, так как я не использую initWithNib. Я попытался переопределить loadView, но все примеры, которые я нашел, не очень ясны в отношении предмета, и loadView никогда не вызывается. Может быть, кто-нибудь может указать мне правильное направление? Тем не менее, я могу слышать мой голос на iphone!

Спасибо за ваше время.

...