AVAudioPlayer - παίζουν πολλά αρχεία ήχου, με τη σειρά

ψήφοι
5

Θέλω να παίξω πολλά αρχεία MP3, στη σειρά (το ένα μετά το άλλο), χρησιμοποιώντας AVAudioPlayer. Το δοκίμασα, και σταματά μετά το παιχνίδι του πρώτου MP3. Ωστόσο, αν πάω στο πρόγραμμα εντοπισμού σφαλμάτων, δουλεύει μια χαρά .. οποιεσδήποτε ιδέες; Διάβασα κάπου AVAudioPlayer παίζει ήχο στο παρασκήνιο .. πώς μπορώ να το αποτρέψει από το να κάνει αυτό; Αγγείο

Δημοσιεύθηκε 07/03/2009 στις 03:29
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
10

Πιστεύω ότι η AVQueuePlayer(υποκατηγορία AVPlayer) κάνει ακριβώς αυτή τη δουλειά (παίζουν μια σειρά από στοιχεία) από το iOS 4.1: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html

Εγώ δεν το δοκιμάσω τον εαυτό μου, ωστόσο, αλλά θα δώσει σίγουρα μια δοκιμή σε αυτό.

Απαντήθηκε 23/08/2012 στις 12:39
πηγή χρήστη

ψήφοι
3

Λοιπόν, π.χ. κωδικός σας δεν λειτουργεί έξω από το κουτί για μένα. Soooo, σκέφτηκα ότι θα απαντήσει με μια σταθερή έκδοση:

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

Και εδώ είναι το πώς θα το ονομάσουμε:

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

Έχω μόνο ελαφρώς πάνω από ένα χρόνο εμπειρίας με την ανάπτυξη iPhone / iPad χρησιμοποιώντας Objective-C έτσι αισθάνεται ελεύθερη να απαντήσει με επιπλέον κριτική.

Απαντήθηκε 09/04/2012 στις 21:21
πηγή χρήστη

ψήφοι
3

Χρησιμοποιήστε μία AVAudioPlayer ανά ήχου.

Απαντήθηκε 02/08/2009 στις 16:51
πηγή χρήστη

ψήφοι
1

Είναι μια καλή ιδέα να προετοιμαστεί, να προετοιμάσει τα στοιχεία, και περιμένω στην ουρά μπροστά από το χρόνο, για παράδειγμα, με τη μέθοδο viewDidLoad.

Αν εργάζεστε σε 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)
    }

και στη συνέχεια, όταν συμβαίνει ένα γεγονός,

 queuePlayer.play()

Σημειώστε ότι αν χρησιμοποιείτε την ουρά, μπορείτε ακόμα να έχετε κάποια κενά μεταξύ των ήχων.

Μπορείτε να βρείτε την έκδοση Objective-C στην ερώτηση Πώς να κάνει κάτι, όταν AVQueuePlayer τελειώνει την τελευταία playeritem

Η ελπίδα αυτό βοηθά.

Απαντήθηκε 29/04/2016 στις 09:35
πηγή χρήστη

ψήφοι
1

Έχω εφάρμοσε μια τάξη για να χειριστεί αυτό.

Για να χρησιμοποιήσετε απλά να κάνουμε κάτι σαν αυτό:

[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
Απαντήθηκε 20/07/2011 στις 06:58
πηγή χρήστη

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