2011-11-12 21 views

Respuesta

1

Para cada canción que desea hacer, haga una sola AVPlayer.

NSURL *url = [NSURL URLWithString:pathToYourFile];
AVPlayer *audioPlayer = [[AVPlayer alloc] initWithURL:url];
[audioPlayer play];

Puede obtener una notificación cuando termina el jugador. Compruebe AVPlayerItemDidPlayToEndTimeNotification al configurar el reproductor:

audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(playerItemDidReachEnd:) 
               name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[audioPlayer currentItem]]; 

esto evitará que el jugador para hacer una pausa al final.

en la notificación:

- (void)playerItemDidReachEnd:(NSNotification *)notification 
{ 
    // start your next song here 
} 

Usted puede comenzar su siguiente canción tan pronto como se obtiene una notificación de que se realiza la canción que se está reproduciendo. Mantenga algún contador que sea persistente entre llamadas de selector. De esta forma, al usar counter % [songs count], obtendrá una lista de reproducción de bucles infinitos :)

No olvide anular el registro de la notificación al soltar el reproductor.

+0

¿Qué hago? poner en playerItemDidReachEnd? audioPlayer2 play? ¿y si tengo 5 canciones? – dot

+0

Sí, puedes hacerlo. El código que puse arriba es teórico. Podría pero no estaría garantizado. Pero la idea parece viable ... –

1

Desafortunadamente, AVAudioPlayer solo puede reproducir un archivo. Para reproducir dos archivos, debe eliminar la primera instancia de AVAudioPlayer y volver a crearla por segunda vez (puede iniciarse usando - (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError). El problema con este enfoque es que hay un pequeño retraso entre el momento en que el primer archivo termina de reproducirse y el segundo archivo comienza a reproducirse. Si desea deshacerse de este retraso, debe profundizar en Core Audio y encontrar una solución mucho más compleja.

+0

Creo que hay una manera. mira mi respuesta 'AVPlayer' tiene un selector de notificaciones que nos dice cuándo termina una canción que se está reproduciendo actualmente. De esa forma, podemos reproducir nuestra próxima canción tan pronto como haya terminado. Eso podría funcionar. –

+0

De hecho, hice una aplicación de radio para iPhone y iPad. Sé que a partir de iOS 4.2 aún había un retraso cuando intentaba reproducir dos archivos seguidos usando AVAudioPlayer. Incluso traté de preparar un AVAudioPlayer por separado usando el método 'prepareToPlay' y hacer que el segundo juego comenzara tan pronto como terminara el primero, pero aún había un ligero retraso. Si no te importa un ligero retraso entre los sonidos, no es gran cosa, pero si quieres una reproducción completamente continua entre los dos archivos, no creo que AVAudioPlayer sea el camino a seguir. –

+0

no se puede imaginar tener una brecha notable cuando se intenta utilizar la notificación a menos que el archivo de audio en sí tenga ruido blanco o algún ruido en blanco al final. De esa forma, 'AVAudioPlayer' seguiría reproduciéndose pero el usuario piensa que hay espacio. Todavía tengo curiosidad por saber por qué esto es tan ... –

13

AVQueuePlayer funcionan para esta situación.

AVQueuePlayer es una subclase de AVPlayer que se usa para reproducir una serie de elementos en secuencia.

+0

muy bien respondida .. Esto es lo que yo quería .. –

9

En lugar de AVAudioPlayer puede utilizar AVQueuePlayer que se adapta mejor a este caso de uso como lo sugiere Ken. Aquí es un poco de código que puede utilizar:

@interface AVSound : NSObject 

@property (nonatomic, retain) AVQueuePlayer* queuePlayer; 

- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType; 
- (void)playQueue; 

@end 

@implementation AVSound 
- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType 
{ 
    // Path to the audio file 
    NSString *path = [[NSBundle mainBundle] pathForResource:pathForResource ofType:ofType]; 

    // If we can access the file... 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 
    { 

     AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]]; 

     if (_queuePlayer == nil) { 
      _queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item]; 
     }else{ 
      [_queuePlayer insertItem:item afterItem:nil]; 
     } 
    } 

} 


- (void)playQueue 
{ 
    [_queuePlayer play]; 
} 
@end 

después utilizarla: En el archivo de interfaz:

@property (strong, nonatomic) AVSound *pageSound; 

En el archivo de aplicación:

- (void)addAudio:(Book*)book pageNum:(int)pageNum 
{ 

    NSString *soundFileEven = [NSString stringWithFormat:@"%02d", pageNum-1]; 
    NSString *soundPathEven = [NSString stringWithFormat:@"%@_%@", book.productId,  soundFileEven]; 
    NSString *soundFileOdd = [NSString stringWithFormat:@"%02d", pageNum]; 
    NSString *soundPathOdd = [NSString stringWithFormat:@"%@_%@", book.productId, soundFileOdd]; 

    if (_pageSound == nil) { 
     _pageSound = [[AVSound alloc]init]; 
     _pageSound.player.volume = 0.5; 
    } 

    [_pageSound clearQueue]; 

    [_pageSound addToPlaylist:soundPathEven ofType:@"mp3"]; 
    [_pageSound addToPlaylist:soundPathOdd ofType:@"mp3"]; 
    [_pageSound playQueue]; 
} 

HTH

Cuestiones relacionadas