2012-04-06 3 views
1

Ich möchte einen aufgenommenen Sound 3-mal loopen, möchte aber eine Sekunde Stille zwischen den Loops, wie kann ich das tun? Mein Code für play_button:AVFoundation: Hinzufügen von Stillepausen zwischen den Wiedergabeschleifen

-(IBAction) play_button_pressed{ 

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

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

} 

1) Alles, was ich zu dieser Methode hinzufügen kann diese eine Sekunde Stille hinzufügen?

2) Wenn nicht, gibt es eine Möglichkeit, der eigentlichen Aufnahme eine Sekunde Stille hinzuzufügen?

EDIT: Danke; Ich habe eine Lösung gefunden, die den Ton einmal mit einer Pause von 2 Sekunden wiederholt; Es ist jedoch keine unendliche Schleife, kannst du sagen, was ich vermisse?

-(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"); 
} 

Antwort

1

Soweit ich weiß, macht keine Methode von AVAudioPlayer "Stille" zwischen der Wiedergabeschleife.

Wenn ich die gleiche Art von Schleife gemacht habe, habe ich die in AVAudioPlayerDelegate und Timer definierte Rückrufmethode verwendet.

Deklarieren Sie in der Header-Datei AVAudioPlayerDelegate wie folgt;

@interface xxxxController : UIViewController 
<AVAudioPlayerDelegate>{ 

Wenn avPlayer beendet den Ton zu spielen, die Methode "audioPlayerDidFinishPlaying" aufgerufen.

Dann rufen Sie Methode, um zum Beispiel eine bestimmte Zeit zu warten;

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

Und in der Methode "waitedtoplay" next [avPlayer play] Anruf

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

Dies ist eine nie endende Schleife, so fügen Sie bitte Zähler die Anzahl der Schleife = 3 zu begrenzen.

EDIT

Bei dem Verfahren Sie als "waitedtoplay" hinzugefügt, verpassten Sie "avplayer.delegate = self" zu setzen. Also, AVAudioPlayer wird nicht "audioPlayerDidFinishPlaying" aufrufen.

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

Bitte fügen Sie es, wie oben, und es wird unendlich wiederholen ...

+0

Vielen Dank, Shin! – MikeDaMike

Verwandte Themen