2016-04-27 11 views
3

Я работаю над музыкальным приложением, Хочется одновременно воспроизводить несколько аудиофайлов, Нашел много ссылок stackoverflow, чтобы получить решение, но до сих пор не повезло с моим сценарием,Воспроизведение/Пауза/Стоп нескольких аудиофайлов одновременно, а также последовательным образом

У меня есть всего 8 массивов. В каждом массиве есть несколько имен звуковых файлов. Мол,

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

Все аудио файлы хранятся локально в моем проекте, с расширением .wav файла.

Теперь, что я хочу достичь, весь массив должен воспроизводиться последовательно с одновременным воспроизведением всех аудиофайлов, которые находятся в одном массиве. т.е. AUD1, AUD2 (array1) должны играть вместе, то сразу же в последовательном порядке aud4, aud5, aud8, aud11 (array2) должны играть одновременно и так далее ..

Кроме того, я хотел бы реализовать Pause/Stop функциональность также. Мне известно с AVAudioPlayer, AVQueuePlayer ..

AVQueuePlayer хорошо работает с последовательным воспроизведением. Я реализовал этот код, Play/Pause/Stop multiple audio file which are stored locally Но он не работает с одновременным воспроизведением, а затем последовательным воспроизведением.

Любая помощь приветствуется!

Заранее благодарен!

ответ

1

@Gati, вы пробовали GCD - Grand Central Dispatch? Я думаю, что это может быть решением вашей проблемы.

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, исх .: https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/

Посмотрите это больше: https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1

+0

Спасибо за ваш ответ! – 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

Спасибо за ваш ответ! – Gati

+0

Не могли бы вы рассказать мне, что такое Looper в вашей первой строке кода? – Gati

+0

Ваш код работает хорошо с последовательным воспроизведением. Но, как я объяснил в своем вопросе, я хочу воспроизводить звук одновременно, который находится внутри одного массива, а затем следующий массив должен играть таким же образом. – Gati