videos reproductor reproducir plus para mejor gratis apple iphone ios audio avaudioplayer

iphone - reproducir - reproductor de videos para apple



AVAudioPlayer: reproducción de archivos de audio múltiples, en secuencia (5)

Quiero reproducir múltiples archivos MP3, en secuencia (uno después del otro), usando AVAudioPlayer. Lo intenté y se detiene después de reproducir el primer MP3. Sin embargo, si entro en el depurador, funciona bien ... ¿Alguna idea? Leí en algún lado AVAudioPlayer reproduce audio en segundo plano ... ¿cómo evito que haga esto? Vas


Bueno, tu ejemplo de código no funcionó de la caja para mí. Así que, pensé que respondería con una versión fija:

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

Y así es como lo llamaría:

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

Solo tengo un poco más de un año de experiencia en el desarrollo de iPhone / iPad usando Objective-C, así que no dude en responder con críticas adicionales.


Es una buena idea inicializar, preparar los elementos y hacer cola antes de tiempo, por ejemplo, en el método viewDidLoad.

Si estás trabajando en 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) }

y luego cuando ocurre un evento,

queuePlayer.play()

Tenga en cuenta que si utiliza la cola, es posible que aún tenga algunas lagunas entre los sonidos.

Puede encontrar la versión de Objective-C en la pregunta Cómo hacer algo cuando AVQueuePlayer finaliza el último elemento de jugador

Espero eso ayude.


Implementé una clase para manejar esto.

Para usar simplemente haz algo como esto:

[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


Use un AVAudioPlayer por sonido.