AVAudioPlayer - het spelen van meerdere audio-bestanden, in de juiste volgorde

stemmen
5

Ik wil meerdere MP3-bestanden af ​​te spelen, in volgorde (na elkaar), met behulp van AVAudioPlayer. Ik probeerde het, en het stopt na het spelen van de eerste MP3. Echter, als ik in de debugger te gaan, het werkt prima .. even welke ideeën? Ik heb ergens gelezen AVAudioPlayer speelt audio op de achtergrond .. hoe kan ik voorkomen dat dit te doen? vas

De vraag is gesteld op 07/03/2009 om 03:29
bron van user
In andere talen...                            


5 antwoorden

stemmen
10

Ik denk dat de AVQueuePlayer(subklasse van AVPlayer) doet precies deze vacature (spelen een reeks van items) sinds iOS 4.1: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html

Ik heb niet proberen het zelf wel, maar zal zeker proberen om het.

antwoordde op 23/08/2012 om 12:39
bron van user

stemmen
3

Nou, uw code bijvoorbeeld niet werkt uit de doos voor mij. Zoooo, ik dacht dat ik zou reageren met een vaste versie:

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

En hier is hoe ik het zou willen noemen:

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

Ik heb slechts iets meer dan een jaar ervaring met de iPhone / iPad ontwikkeling met behulp van Objective-C dus voel je vrij om te reageren met extra kritiek.

antwoordde op 09/04/2012 om 21:21
bron van user

stemmen
3

Gebruik een AVAudioPlayer per sound.

antwoordde op 02/08/2009 om 16:51
bron van user

stemmen
1

Het is een goed idee om te initialiseren, de voorbereiding van de items, en de wachtrij van tevoren, bijvoorbeeld over de viewDidLoad methode.

Als u werkt op 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)
    }

en wanneer een gebeurtenis plaatsvindt,

 queuePlayer.play()

Merk op dat als je de wachtrij te gebruiken, je nog steeds zou kunnen hebben een aantal lacunes tussen de geluiden.

U kunt de Objective-C versie in de vraag hoe je iets moet doen als AVQueuePlayer eindigt de laatste playeritem

Hoop dat het helpt.

antwoordde op 29/04/2016 om 09:35
bron van user

stemmen
1

Ik heb een klasse geïmplementeerd om dit te verwerken.

Om gebruik te maken net iets doen als dit:

[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
antwoordde op 20/07/2011 om 06:58
bron van user

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