2013-12-16 7 views
0

Я использую AVAudioRecorder для записи звукового файла различной длины со следующей конфигурацией:AVAudioRecorder Потеря Последние секунды

- (AVAudioRecorder*)recorder 
{ 
    if(!_recorder) { 
     // Set the audio file 
     NSArray *pathComponents = [NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], @"ExamTranscript.m4a", nil]; 
     self.soundFileURL = [NSURL fileURLWithPathComponents:pathComponents]; 

     // Define the recorder setting 
     NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

     [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
     [recordSetting setValue:[NSNumber numberWithFloat:16000.0] forKey:AVSampleRateKey]; 
     [recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 

     // Initiate and prepare the recorder 
     _recorder = [[AVAudioRecorder alloc] initWithURL:self.soundFileURL settings:recordSetting error:NULL]; 
     _recorder.meteringEnabled = YES; 
     _recorder.delegate = self; 
    } 

    return _recorder; 
} 

Когда я называю [self.recorder stop] последние 2-3 секунды записи никогда не учитываются (и они обязательно необходимы.)

Например, если я звоню self.recorder.currentTime прямо перед тем, как позвонить [self.recorder stop] Я получу NSTimeInterval больше, чем фактическая продолжительность сгенерированного файла примерно на 2-3 секунды. Все, что записано за эти 2-3 секунды, затем теряется.

После вызова [self.recorder stop] Я получаю соответствующий метод делегата audioRecorderDidFinishRecording:successfully:, и флаг указывает, что он успешный.

У меня полная потеря относительно того, как эти последние секунды теряются. (Рекордер не выпускается и по-прежнему существует сильная ссылка на него.)

UPDATE

Приложение предлагает пользователю говорить несколько раз, так что AVAudioRecorder приостановлена ​​и возобновлена ​​несколько раз перед тем, как остановился в конце окончательного ответа. Он приостанавливается, а не останавливается, потому что все его нужно записать в один аудиофайл.

ответ

1

Просмотрев ограниченный код, который вы поделили, я могу только подозревать, что вы можете использовать объект рекордера ненадлежащим образом.

Основные пункты ниже и следить за код, который может помочь вам .. (это работает для меня)

1) Вы должны создать/INIT AVAudioRecorder каждый раз, когда вы начинаете новую запись.

2) CURRENTTIME свойство AVAudioRecorder действует только тогда, когда выполняется запись (т.е. isRecording ДА)

// class properties 
@property (nonatomic, retain) AVAudioRecorder *audioRecorder; 
@property (nonatomic, retain) NSDictionary *recordQualitySettings; 
@property (nonatomic, assign) NSInteger maxRecordDurationInSeconds; 

// class's designated initializer 
- (instancetype)init 
{ 
    self = [super init]; 

    if (self) { 
     self.recordQualitySettings = [NSDictionary 
           dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:kAudioFormatAppleIMA4], 
           AVFormatIDKey, 
           [NSNumber numberWithInt:1], 
           AVNumberOfChannelsKey, 
           [NSNumber numberWithFloat:16000.0], //?? 
           AVSampleRateKey, 
           nil]; 
... 
... 
    } 

    return self; 
} 

- (void)recordBegin 
{ 
    NSString *temnpVoiceFile = [NSString pathWithComponents:[NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], @"tempVoice.caf", nil]]; 
    NSURL *soundFileURL = [NSURL fileURLWithPath:temnpVoiceFile]; 
    NSError *error = nil; 

    // Instantiate an audio recorder. 
    self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:self.recordQualitySettings error:&error]; 
    NSAssert1(!error, @"error creating audio file = %@", error); 

    self.audioRecorder.delegate = self; 
    self.audioRecorder.meteringEnabled = YES; 

    [self.audioRecorder recordForDuration:self.maxRecordDurationInSeconds]; // Any of the 'record..' methods that triggers recording. 

} 

EDIT:

После вашего вызова stop записи с помощью [self.audioRecorder stop] или внутри audioRecorderDidFinishRecording делегата метод, пожалуйста, проверьте продолжительность звука, используя приведенный ниже код (на основе URL)? Просто перекрестите проверку, что currentTime неверен.

AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:self.audioRecorder.url options:nil]; // delegate method provide you `recorder` object as parameter too. 
CMTime audioDuration = audioAsset.duration; 
double duration = CMTimeGetSeconds(audioDuration); 
+0

Я делаю только одну запись, поэтому я не пытаюсь использовать один и тот же экземпляр AVAudioRecorder для создания нескольких записей. Кроме того, 'recorder.currentTime' доступен только внутри' if (recorder.isRecording) 'условного. – TimOfTheYear

+0

Чтобы помочь вам лучше, укажите дополнительный код в контексте. Как вы записываете/приостанавливаете/останавливаете рекордер и где вы проверяете 'currentTime'? Если 'stop' выполняется в основном потоке (isMainThread) и т. Д. Также обратите внимание на __EDIT__ в моем ответе выше. – Ashok