Θέλω να παίξω πολλά αρχεία MP3, στη σειρά (το ένα μετά το άλλο), χρησιμοποιώντας AVAudioPlayer. Το δοκίμασα, και σταματά μετά το παιχνίδι του πρώτου MP3. Ωστόσο, αν πάω στο πρόγραμμα εντοπισμού σφαλμάτων, δουλεύει μια χαρά .. οποιεσδήποτε ιδέες; Διάβασα κάπου AVAudioPlayer παίζει ήχο στο παρασκήνιο .. πώς μπορώ να το αποτρέψει από το να κάνει αυτό; Αγγείο
AVAudioPlayer - παίζουν πολλά αρχεία ήχου, με τη σειρά
Πιστεύω ότι η AVQueuePlayer(υποκατηγορία AVPlayer) κάνει ακριβώς αυτή τη δουλειά (παίζουν μια σειρά από στοιχεία) από το iOS 4.1:
http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html
Εγώ δεν το δοκιμάσω τον εαυτό μου, ωστόσο, αλλά θα δώσει σίγουρα μια δοκιμή σε αυτό.
Λοιπόν, π.χ. κωδικός σας δεν λειτουργεί έξω από το κουτί για μένα. 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 έτσι αισθάνεται ελεύθερη να απαντήσει με επιπλέον κριτική.
Χρησιμοποιήστε μία AVAudioPlayer ανά ήχου.
Είναι μια καλή ιδέα να προετοιμαστεί, να προετοιμάσει τα στοιχεία, και περιμένω στην ουρά μπροστά από το χρόνο, για παράδειγμα, με τη μέθοδο 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
Η ελπίδα αυτό βοηθά.
Έχω εφάρμοσε μια τάξη για να χειριστεί αυτό.
Για να χρησιμοποιήσετε απλά να κάνουμε κάτι σαν αυτό:
[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













