AVAudioPlayer - lire plusieurs fichiers audio, en séquence

voix
5

Je veux jouer plusieurs fichiers MP3, dans l'ordre (l'un après l'autre), en utilisant AVAudioPlayer. Je l'ai essayé, et il arrête après avoir joué le premier MP3. Cependant, si je vais dans le débogueur, il fonctionne très bien .. toutes les idées? J'ai lu quelque part AVAudioPlayer joue audio en arrière-plan .. comment puis-je l'empêcher de le faire? VAS

Créé 07/03/2009 à 03:29
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
10

Je pense que la AVQueuePlayer(sous - classe de AVPlayer) fait exactement ce travail (lire une séquence d'éléments) depuis iOS 4.1: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html

Je ne l'ai pas essayé moi-même cependant, mais va certainement donner un essai à elle.

Créé 23/08/2012 à 12:39
source utilisateur

voix
3

Eh bien, votre exemple de code ne fonctionne pas hors de la boîte pour moi. Soooo, je me suis dit que je répondrais avec une version fixe:

Looper.h:

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

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

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

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

@end

Looper.m:

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

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

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 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];
    [player release];
    player.delegate = self;
    [player prepareToPlay];
    [player play];    
    index++;
}

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

- (void)dealloc {
    self.fileNameQueue = nil;
    self.player = nil;        
    [super dealloc];
}

@end

Et voici comment je l'appellerais:

 Looper * looper = [[Looper alloc] initWithFileNameQueue:[NSArray arrayWithObjects: audioFile, audioFile2, nil ]];

Je n'ai que peu plus d'un an d'expérience avec le développement iPhone / iPad à l'aide Objective-C ne hésitez donc pas à répondre aux critiques supplémentaires.

Créé 09/04/2012 à 21:21
source utilisateur

voix
3

Utilisez un AVAudioPlayer par son.

Créé 02/08/2009 à 16:51
source utilisateur

voix
1

Il est une bonne idée d'initialiser, préparer les éléments et la file d'attente à l'avance, par exemple sur la méthode viewDidLoad.

Si vous travaillez sur Swift,

    override func viewDidLoad() {
        super.viewDidLoad()
        let item0 = AVPlayerItem.init(URL: NSBundle.mainBundle().URLForResource("url", withExtension: "wav")!)

        let item1 = AVPlayerItem.init(URL: NSBundle.mainBundle().URLForResource("dog", withExtension: "aifc")!)
        let item2 = AVPlayerItem.init(URL: NSBundle.mainBundle().URLForResource("GreatJob", withExtension: "wav")!)


        let itemsToPlay:[AVPlayerItem] = [item0, item1, item2] 
        queuePlayer = AVQueuePlayer.init(items: itemsToPlay)
    }

et puis quand un événement se produit,

 queuePlayer.play()

Notez que si vous utilisez la file d'attente, vous pourriez encore avoir des écarts entre les sons.

Vous pouvez trouver la version Objective-C dans la question Comment faire quelque chose quand AVQueuePlayer se termine le dernier playeritem

J'espère que cela aide.

Créé 29/04/2016 à 09:35
source utilisateur

voix
1

J'ai mis en place une classe pour gérer cela.

Pour utiliser le faire quelque chose comme ceci:

[looper playAudioFiles:[NSArray arrayWithObjects:
    @"add.mp3",
    [NSString stringWithFormat:@"%d.mp3", numeral1.tag],
    @"and.mp3",
    [NSString stringWithFormat:@"%d.mp3", numeral2.tag],
    nil
]];

Looper.m

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

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

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 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];
    [player release];
    player.delegate = self;
    [player prepareToPlay];
    [player play];    
    index++;
}

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

- (void)dealloc {
    self.fileNameQueue = nil;
    self.player = nil;        
    [super dealloc];
}

@end

Looper.h

#import <Foundation/Foundation.h>


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

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

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


@end
Créé 20/07/2011 à 06:58
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more