2012-08-29 11 views
12

Estoy reproduciendo un programa de televisión que se ha dividido en diferentes capítulos de mi proyecto utilizando un AVQueuePlayer. También quiero ofrecer la posibilidad de saltar al capítulo anterior/siguiente o seleccionar un capítulo diferente sobre la marcha, mientras el AVQueuePlayer ya se está reproduciendo.Saltar a anterior AVPlayerItem en AVQueuePlayer/Reproducir el elemento seleccionado de la cola

Saltar al siguiente elemento no es problema con el advanceToNextItem proporcionado por AVQueuePlayer, pero no hay nada parecido para saltar hacia atrás o reproducir un cierto elemento de la cola.

Así que no estoy muy seguro de lo que sería el mejor enfoque aquí:

  1. El uso de un AVPlayer en lugar de AVQueuePlayer, invocar replaceCurrentItemWithPlayerItem: en actionAtItemEnd para jugar el nextItem y el uso justo 'replaceCurrentItemWithPlayerItem' para que seleccione el usuario un determinado capítulo

o

  1. reorganizar la cola o el jugador actual mediante el uso de ' insertItem: afterItem:' y '

Información adicional RemoveAllItems': que almacena la ruta a los diferentes vídeos en el orden en que deben aparecer en una NSArray se supone que el usuario saltar a ciertos capítulos pulsando los botones que representar el capitulo Los botones tienen etiquetas, que también son los índices de los videos correspondientes en la matriz.

Espero que pueda aclararme? ¿Alguien tiene alguna experiencia con esta situación? Si alguien sabe dónde comprar un buen IOS VideoPlayerFramework que proporciona la funcionalidad, también agradecería el enlace.

+2

Me fascina que no haya una búsqueda de elemento en el método de índice para AVQueuePlayer. – Morkrom

+0

¿Puedo preguntar, tenía controles personalizados para detectar lo que el usuario presionó o de alguna manera logró detectar el siguiente botón de los controles predeterminados en AVQeuePlayer? – schmru

Respuesta

20

Si desea que su programa pueda reproducir el elemento anterior y reproducir el elemento seleccionado desde sus elementos de jugador (NSArray), puede hacerlo.

- (void)playAtIndex:(NSInteger)index 
{ 
    [player removeAllItems]; 
    for (int i = index; i <playerItems.count; i ++) { 
     AVPlayerItem* obj = [playerItems objectAtIndex:i]; 
     if ([player canInsertItem:obj afterItem:nil]) { 
     [obj seekToTime:kCMTimeZero]; 
     [player insertItem:obj afterItem:nil]; 
     } 
    } 
} 

edición: playerItems es el NSMutableArray (NSArray) donde se almacenan los AVPlayerItems.

+0

Gracias. Estaba haciendo algo similar a eso. Pero al final terminé usando solo un archivo de video y una matriz con punteros al comienzo de los capítulos y la función seekTo. – Amandir

+1

Si tiende a jugar sin espacios, su solución parece ser la única forma de hacerlo. – saiday

+1

¿Hay alguna forma de hacerlo sin borrar la cola? –

4

La primera respuesta elimina todos los elementos de AVQueuePlayer y vuelve a llenar la cola que comienza con la iteración pasada como índice arg. Esto comenzaría la cola recién poblada con el elemento anterior (asumiendo que pasó el índice correcto) así como el resto de los elementos en la matriz existente de elementos de jugador de ese punto en adelante, PERO no permite múltiples reveses, p. estás en la pista 10 y quieres regresar y reproducir la pista 9, luego reproducir la pista 5, con lo anterior no puedes lograrlo. Pero aquí puede ...

-(IBAction) prevSongTapped: (id) sender 
{ 
    if (globalSongCount>1){ //keep running tally of items already played 
    [self resetAVQueue]; //removes all items from AVQueuePlayer 

     for (int i = 1; i < globalSongCount-1; i++){ 
      [audioQueuePlayer advanceToNextItem]; 
     } 
    globalSongCount--; 
    [audioQueuePlayer play]; 


    } 
} 
2

El siguiente código le permite saltar a cualquier elemento en su. Sin cabeza de jugador avanzando. Simple y simple. playerItemList es tu NSArray con objetos AVPlayerItem.

- (void)playAtIndex:(NSInteger)index 
{ 
    [audioPlayer removeAllItems]; 
    AVPlayerItem* obj = [playerItemList objectAtIndex:index]; 
    [obj seekToTime:kCMTimeZero]; 
    [audioPlayer insertItem:obj afterItem:nil]; 
    [audioPlayer play]; 
} 
+0

esto tiene sentido. pero luego eliminará todo de la lista cada vez que quiera reproducir esa canción indexada. ¿por qué no usar AVPlayer en este caso? Te di +1 voto aunque –

2

djiovann creado una subclase de AVQueuePlayer que proporciona exactamente esta funcionalidad.

Lo puede encontrar en github.

No lo he probado todavía, pero al navegar por el código parece que hace el trabajo. Además, el código está bien documentado, por lo que al menos debería servir como una buena referencia para una implementación personalizada de la funcionalidad (sugiero usar una categoría en lugar de subclases).

0

Si desea reproducir una canción de cualquier índice mediante AVQueuePlayer. A continuación, puede ayudar a este código a continuación.

NSMutableArray *musicListarray(add song that you want to play in queue); 
AVQueuePlayer *audioPlayer; 
AVPlayerItem *item; 


    -(void)nextTapped { 

     nowPlayingIndex = nowPlayingIndex+1; 

     if(nowPlayingIndex > musicListarray.count) { 
     } 
     else{ 
     [self playTrack]; 
     } 
    } 


    -(void)playback { 

    if (nowPlayingIndex < 0) { 
    } 
    else { 
     nowPlayingIndex = nowPlayingIndex -1; 
     [self playTrack]; 
    } 

} 

-(void)playTrack{ 

@try { 
    if (musicArray.count > 0) { 
     item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:musicListarray[nowPlayingIndex]]]; 
     [audioPlayer replaceCurrentItemWithPlayerItem:item]; 
     [audioPlayer play]; 

    } 

} @catch (NSException *exception) { 

} 
} 


    -(void)PlaySongAtIndex{ 
    //yore code... 
     nowPlayingIndex = i(stating index from queue) 
     [audioPlayer play]; 
     [self playTrack]; 
    } 

Aquí PlaySongAtIndex llama cuando quieres escuchar una canción.

Cuestiones relacionadas