AVAudioPlayer - spielen mehrere Audio-Dateien, in Folge

stimmen
5

Ich möchte mehrere MP3-Dateien abspielen, in Folge (nacheinander), mit AVAudioPlayer. Ich versuchte es, und es stoppt nach dem ersten Wiedergabe von MP3. Allerdings, wenn ich in Debugger gehen, es funktioniert gut .. irgendwelche Ideen? Ich habe irgendwo gelesen AVAudioPlayer spielt Audio im Hintergrund .. Wie verhindere ich es von diesem? Vas

Veröffentlicht am 07/03/2009 um 03:29
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
10

Ich denke , die AVQueuePlayer(Unterklasse AVPlayer) macht genau diesen Job (eine Folge von Elementen spielen) seit iOS 4.1: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html

Ich habe nicht versucht, es selbst aber wird aber auf jeden Fall einen Versuch geben.

Beantwortet am 23/08/2012 um 12:39
quelle vom benutzer

stimmen
3

Nun, Ihr Codebeispiel funktionierte nicht für mich aus der Box. Soooo, ich dachte, ich mit einer festen Version reagieren würde:

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

Und hier ist, wie ich es nennen würde:

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

Ich habe nur etwas mehr als ein Jahr Erfahrung mit iPhone / iPad-Entwicklung mit Objective-C, so fühlt sich frei, mit zusätzlicher Kritik zu reagieren.

Beantwortet am 09/04/2012 um 21:21
quelle vom benutzer

stimmen
3

Verwenden Sie eine AVAudioPlayer pro Ton.

Beantwortet am 02/08/2009 um 16:51
quelle vom benutzer

stimmen
1

Es ist eine gute Idee zu initialisieren, die Einzelteile und vor der Zeit, zum Beispiel auf der viewDidLoad Methode Warteschlange.

Wenn Sie auf Swift arbeiten,

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

und dann, wenn ein Ereignis eintritt,

 queuePlayer.play()

Beachten Sie, dass, wenn Sie die Warteschlange verwenden, können Sie immer noch einige Lücken zwischen den Klängen haben könnten.

Sie können die Objective-C - Version in der Frage zu finden , wie etwas zu tun ist, wenn AVQueuePlayer die letzte playeritem beendet

Ich hoffe es hilft.

Beantwortet am 29/04/2016 um 09:35
quelle vom benutzer

stimmen
1

Ich habe eine Klasse implementiert, dies zu umgehen.

nur tun, so etwas zu verwenden:

[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
Beantwortet am 20/07/2011 um 06:58
quelle vom benutzer

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