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
AVAudioPlayer - spielen mehrere Audio-Dateien, in Folge
quelle vom benutzer spnj83
In anderen Sprachen...
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.
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.
Verwenden Sie eine AVAudioPlayer pro Ton.
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.
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