2012-04-06 2 views
1

Я хочу три раза закодировать записанный звук, но хочу одну секунду молчания между циклами, как я могу это сделать? Мой код play_button:AVFoundation: добавление паузы паузы между циклами воспроизведения

-(IBAction) play_button_pressed{ 

AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error]; 

[avPlayer setNumberOfLoops: 2]; 
[avPlayer play]; 

} 

1) Все, что я могу добавить к этому методу, чтобы добавить одну секунду молчания?

2) Если нет, есть ли способ добавить вторую тишину к реальной записи?

EDIT: Thanks; Я получил решение, которое повторяет звук один раз с паузой в 2 секунды; он не зацикливается бесконечно, хотя, можете ли вы сказать, чего я не хватает?

-(IBAction) play_button_pressed{ 

AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error]; 

//[avPlayer setNumberOfLoops: 2]; 
avPlayer.delegate = self; 
[avPlayer prepareToPlay]; 
[avPlayer play]; 

} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)avPlayer successfully:(BOOL)flag 
{ 
NSLog(@"audioPlayerDidFinishPlaying"); 
tm = [NSTimer scheduledTimerWithTimeInterval:2.0 
           target:self 
           selector:@selector(waitedtoplay) 
           userInfo:nil 
           repeats:NO]; 
} 

-(void) waitedtoplay 
{ 
    AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error]; 
[tm invalidate]; 
[avPlayer prepareToPlay]; 
[avPlayer play]; 
NSLog(@"waitedtoplay"); 
} 

ответ

1

Насколько я знаю, ни один из методов AVAudioPlayer не делает «тишину» между игровым циклом.

Когда я сделал такой же цикл, я использовал метод обратного вызова, определенный в AVAudioPlayerDelegate и таймере.

В файле заголовка объявите использовать AVAudioPlayerDelegate следующим образом;

@interface xxxxController : UIViewController 
<AVAudioPlayerDelegate>{ 

Когда AVPlayer заканчивается для воспроизведения звука, метод "audioPlayerDidFinishPlaying" будет называться.

Затем вызовите метод для ожидания определенного периода времени, например;

-(void) wait{ 
float seconds = 2.0f; 
tm = [NSTimer scheduledTimerWithTimeInterval:seconds 
             target:self 
            selector:@selector(waitedtoplay) 
            userInfo:nil 
            repeats:NO]; 
} 

И, в методе «waitedtoplay», вызов следующий [AVPlayer игра]

-(void) waitedtoplay{ 
    [tm invalidate]; 
    [avPlayer play]; 
} 

Это нескончаемый цикл, поэтому, пожалуйста, добавить счетчик, чтобы ограничить число петли = 3.

EDIT

в методе вы добавили как "waitedtoplay", вы пропустили, чтобы установить "avplayer.delegate = Я". Итак, AVAudioPlayer не будет называть «audioPlayerDidFinishPlaying».

-(void) waitedtoplay 
{ 
AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error]; 
[tm invalidate]; 
avPlayer.delegate = self; <<=== MISSING ! 
[avPlayer prepareToPlay]; 
[avPlayer play]; 
NSLog(@"waitedtoplay"); 
} 

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

+0

Спасибо большое, Шин! – MikeDaMike

Смежные вопросы