2016-04-27 1 views
3

Je travaille sur l'application musicale, Vous voulez jouer plusieurs fichiers audio simultanément, J'ai trouvé beaucoup de liens stackoverflow pour obtenir la solution mais toujours pas de chance pour mon scénario,Lecture/Pause/Arrêt de plusieurs fichiers audio simultanément et également de façon séquentielle

J'ai un total de 8 tableaux. Dans chaque tableau, il y a un certain nombre de noms de fichiers audio. Comme ,

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

Tous les fichiers audio sont stockés localement dans mon projet, avec l'extension de fichier .wav.

Maintenant, ce que je veux réaliser, c'est que tout le tableau devrait jouer de manière séquentielle avec la lecture simultanée de tous les fichiers audio qui se trouvent dans un tableau. à-dire AUD1, AUD2 (matrice1) doivent jouer ensemble alors instantanément AUD4 de manière séquentielle, AUD5, aud8, aud11 (array2) devraient jouer simultanément et ainsi de suite ..

Je voulais aussi mettre en œuvre Pause/fonctionnalité d'arrêt ainsi que. Je suis au courant avec AVAudioPlayer, AVQueuePlayer ..

AVQueuePlayer fonctionne bien avec la lecture séquentielle. J'ai implémenté ce code, Play/Pause/Stop multiple audio file which are stored locally Mais cela ne fonctionne pas avec un jeu simultané suivi d'un jeu séquentiel.

Toute aide est appréciée!

Merci d'avance!

Répondre

1

@Gati, avez-vous essayé GCD - Grand Central Dispatch? Je pense que cela pourrait être la solution à votre problème.

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); 

     }); 
    } 

d'Apple réf .: https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/

Regardez ce pour plus: https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1

+0

Merci pour votre réponse! – 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

Merci pour votre réponse! – Gati

+0

Pouvez-vous s'il vous plaît dites-moi, Qu'est-ce que Looper dans votre première ligne de code? – Gati

+0

Votre code fonctionne bien avec le jeu séquentiel. Mais comme je l'ai expliqué dans ma question, je veux jouer de l'audio simultanément qui est à l'intérieur d'un seul tableau, puis immédiatement le tableau suivant devrait jouer de la même manière. – Gati