2016-04-27 36 views
3

Ich arbeite an Musik-Anwendung, Willst du mehrere Audio-Dateien gleichzeitig spielen, Gefunden viele Stackoverflow-Links, um die Lösung, aber immer noch kein Glück für mein Szenario,Play/Pause/Stop mehrere Audiodateien gleichzeitig und auch sequentiell

Ich habe insgesamt 8 Arrays, in jedem Array gibt es einige Anzahl von Audio-Dateien Namen. Wie,

array1 = @[@"aud1",@"aud2"]; 
array2 = @[@"aud4",@"aud5",@"aud8",@"aud11"]; 
.... 
array8 = @[@"aud3",@"aud6",@"aud7"]; 

Alle Audio-Dateien werden lokal in meinem Projekt, mit .wav-Dateierweiterung gespeichert.

Nun, was ich erreichen möchte, ist, dass das gesamte Array in sequenzieller Weise mit gleichzeitiger Wiedergabe aller Audiodateien, die sich in einem Array befinden, abgespielt werden soll. dh AUD1, aud2 (array1) sollten zusammen dann sofort in sequentieller Weise AUD4, aud5, aud8 spielen, aud11 (array2) sollten gleichzeitig und so weiter spielen ..

Auch wollte ich Pause/Stopp-Funktionalität implementieren auch. Ich bin bewusst mit AVAudioPlayer, AVQueuePlayer ..

AVQueuePlayer funktioniert gut mit sequenziellem Spiel. Ich habe diesen Code implementiert, Play/Pause/Stop multiple audio file which are stored locally Aber es funktioniert nicht mit gleichzeitigem Spiel gefolgt von sequentiellem Spiel.

Jede Hilfe wird geschätzt!

Vielen Dank im Voraus!

Antwort

1

@Gati, haben Sie versucht GCD - Grand Central Dispatch? Ich denke, es könnte die Lösung für Ihr Problem sein.

NSArray *array = @[@"aud1",@"aud2"]; 
    for (id obj in array) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      // Play each aud here 
      NSLog(@"%@",obj); 

     }); 
    } 

Apple-Ref .: https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/

Schauen Sie dies für mehr: https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1

+0

Danke für Ihre Antwort! – Gati

1
Player * play = [[Looper alloc] initWithFileNameQueue:[NSArray arrayWithObjects: audioFile, audioFile2, nil ]]; 

Player.h

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 

@interface Player : NSObject <AVAudioPlayerDelegate> { 
    AVAudioPlayer* play; 
    NSArray* fileNameQueue; 
    int index; 
} 

@property (nonatomic, retain) AVAudioPlayer* play; 
@property (nonatomic, retain) NSArray* fileNameQueue; 

- (id)initWithFileNameQueue:(NSArray*)queue; 
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)play successfully:(BOOL)flag; 
- (void)play:(int)i; 
- (void)stop; 

@end 

Player.m

#import "Player.h" 
@implementation Play 
@synthesize player, fileNameQueue; 

- (id)initWithFileNameQueue:(NSArray*)queue { 
    if ((self = [super init])) { 
     self.fileNameQueue = queue; 
     index = 0; 
     [self play:index]; 
    } 
    return self; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)play successfully:(BOOL)flag { 
    if (index < fileNameQueue.count) { 
     [self play:index]; 
    } else { 
     //reached end of queue 
    } 
} 

- (void)play:(int)i { 
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[fileNameQueue objectAtIndex:i] ofType:nil]] error:nil]; 
    play.delegate = self; 
    [play prepareToPlay]; 
    [play play];  
    index++; 
} 

- (void)stop { 
    if (self.play.playing) [play stop]; 
} 


@end 
+0

Danke für Ihre Antwort! – Gati

+0

Können Sie mir bitte sagen, Was ist Looper in Ihrer ersten Codezeile? – Gati

+0

Ihr Code funktioniert gut mit dem sequentiellen Abspielen. Aber wie ich in meiner Frage erklärte, möchte ich Audio gleichzeitig spielen, der innerhalb des einzelnen Feldes ist, dann sofort sollte das nächste Feld in der gleichen Weise spielen. – Gati