AVAudioPlayer - giocare più file audio, in sequenza

voti
5

Voglio giocare più file MP3, in sequenza (una dopo l'altra), utilizzando AVAudioPlayer. Ho provato, e si ferma dopo aver giocato il primo MP3. Tuttavia, se vado in debugger, funziona benissimo .. tutte le idee? Ho letto da qualche AVAudioPlayer riproduce l'audio in sottofondo .. come faccio a impedire che fare questo? Vas

È pubblicato 07/03/2009 alle 03:29
fonte dall'utente
In altre lingue...                            


5 risposte

voti
10

Credo che la AVQueuePlayer(sottoclasse di AVPlayer) fa esattamente questo lavoro (giocare una sequenza di elementi) dal iOS 4.1: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html

Non ho provato io stesso però, ma sicuramente dare una prova di esso.

Risposto il 23/08/2012 a 12:39
fonte dall'utente

voti
3

Bene, il vostro esempio di codice non ha funzionato fuori dalla scatola per me. Soooo, ho pensato di rispondere con una versione fissa:

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

Ed ecco come la definirei:

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

Ho solo un po 'più di un anno di esperienza con lo sviluppo iPhone / iPad utilizzando Objective-C quindi sentitevi liberi di rispondere con la critica supplementare.

Risposto il 09/04/2012 a 21:21
fonte dall'utente

voti
3

Utilizzare un'AVAudioPlayer per ogni suono.

Risposto il 02/08/2009 a 16:51
fonte dall'utente

voti
1

E 'una buona idea per inizializzare, preparo gli articoli, e in coda prima del tempo, per esempio sul metodo viewDidLoad.

Se si sta lavorando su 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)
    }

e poi, quando si verifica un evento,

 queuePlayer.play()

Si noti che se si utilizza la coda, è ancora potrebbe avere alcune lacune tra i suoni.

È possibile trovare la versione Objective-C per la questione Come fare qualcosa quando AVQueuePlayer finisce l'ultimo playeritem

Spero che sia d'aiuto.

Risposto il 29/04/2016 a 09:35
fonte dall'utente

voti
1

Ho implementato una classe per gestire questa situazione.

Per utilizzare solo fare qualcosa di simile a questo:

[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
Risposto il 20/07/2011 a 06:58
fonte dall'utente

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