Установка ограничения по времени при записи аудиоклипа?

#xcode #ios4 #core-audio #avaudiorecorder

#xcode #ios4 #ядро-аудио #avaudiorecorder

Вопрос:

Я искал поисковые запросы по строкам заголовка поста, но увы..

Я создаю приложение для iPhone, используя AVFoundation.

Существует ли правильная процедура для ограничения объема записываемого звука? Я бы хотел максимум 10 секунд.

Спасибо за любую помощь / совет / подсказок / указателей..

Ответ №1:

AVAudioRecorder использует следующий метод:

 - (BOOL)recordForDuration:(NSTimeInterval)duration
  

Я думаю, это поможет!

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioRecorder_ClassReference/Reference/Reference.html#//apple_ref/doc/uid/TP40008238

Комментарии:

1. Что ж, ответ на этот вопрос был получен и принят более 4 лет назад. Думаю, тогда это сработало. Я не знаю, так ли это сейчас. почему?

2. когда я вызываю метод, он не запускает метод делегирования audioRecorderDidFinishRecording: успешно.. я вызываю это [настройка записи рекордера: 10.0f], но ничего не происходит. Я ожидал закончить запись..

Ответ №2:

Обычно я не работаю с, AVFoundation поэтому я не знаю точных названий методов / классов (я ввел свои собственные), но обходным путем для этого было бы повторяющееся NSTimer начало при первоначальном запуске записи. Что-то вроде этого:

 @interface blahblah
...
int rec_time;
NSTimer *timer;
Recorder *recorder;
...
@end

@implementation blahblah
...
-(void)beginRecording {
    [recorder startRecording];
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
    target:self
    selector:@selector(recordingTime)
    userInfo:nil
    repeats:YES];
}

-(int)recordingTime {
    if (rec_time >= 10) {
        [recorder endRecording];
        [timer invalidate];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"You recorded for too long!"...;
        return;
    }

    rec_time = rec_time   1;

}
...
@end
  

Комментарии:

1. Спасибо вам за это. Я подожду и увижу другие ответы, но я действительно ценю ваше время и усилия.

2. кстати, почему вы не работаете с AVFoundation? Есть ли способ получше? Еще раз спасибо..

Ответ №3:

Это пример из кулинарной книги по программированию для iOS, я нашел его очень полезным и прямым. После начала записи вы вызываете функцию остановки с задержкой в 10 секунд, когда она останавливает запись, она автоматически вызывает метод делегирования audioRecorderDidFinishRecording:successfully .

 @implementation ViewController{

   AVAudioRecorder *recorder;
   AVAudioPlayer *player;
}   

- (IBAction)recordPauseTapped:(id)sender {
// Stop the audio player before recording
   if (player.playing) {
     [player stop];
   }

   if (!recorder.recording) {
      AVAudioSession *session = [AVAudioSession sharedInstance];
      [session setActive:YES error:nil];

      // Start recording
      [recorder record];

     [recordPauseButton setBackgroundImage:recordingImage forState:UIControlStateNormal];
     [self performSelector:@selector(stopRecording)
               withObject:self afterDelay:10.0f];

     } else {
       [recorder stop];

       AVAudioSession *audioSession = [AVAudioSession sharedInstance];
       [audioSession setActive:NO error:nil];
     }
} 

- (void)stopRecording {
  [recorder stop];

  AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  [audioSession setActive:NO error:nil];
}

 - (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder    successfully:(BOOL)flag{
    NSLog(@"after 10 sec");
}