2012-08-29 17 views
12

Ich spiele eine TV-Show, die mit einem AVQueuePlayer in verschiedene Kapitel meines Projekts geschnitten wurde. Ich möchte auch die Möglichkeit anbieten, zum vorherigen/nächsten Kapitel zu springen oder ein anderes Kapitel im laufenden Betrieb auszuwählen, während der AVQueuePlayer bereits spielt.Zum vorherigen AVPlayerItem auf AVQueuePlayer/Ausgewähltes Element aus der Warteschlange abspielen

Mit dem von AVQueuePlayer bereitgestellten advanceToNextItem ist das Springen zum nächsten Eintrag kein Problem, aber es gibt nichts Ähnliches für das Zurückspringen oder das Abspielen eines bestimmten Elements aus der Warteschlange.

So bin ich nicht ganz sicher, was der beste Ansatz wäre hier:

  1. Mit einem AVPlayer statt AVQueuePlayer, ruft replaceCurrentItemWithPlayerItem: bei actionAtItemEnd die nextItem zu spielen und verwendet nur ‚replaceCurrentItemWithPlayerItem‘ die Nutzer lassen wählen ein bestimmtes Kapitel

oder

  1. die Warteschlange oder den aktuellen Spieler reorganisieren durch 'mit InsertItem: afterItem:‘und‚RemoveAllItems‘

Zusätzliche Informationen: Ich speichern den Weg zu den verschiedenen Videos in der Reihenfolge, wie sie in einem NSArray Der Benutzer durch Drücken der Tasten auf bestimmte Kapitel springen sollte angezeigt werden sollen, dass repräsentiere das Kapitel. Die Buttons haben Tags, die auch die Indizes der entsprechenden Videos im Array sind.

Hoffe ich konnte mich klar machen? Wer hat schon Erfahrung mit dieser Situation? Wenn jemand weiß, wo man einen guten IOS VideoPlayerFramework kaufen kann, der die Funktionalität bietet, würde ich auch den Link schätzen.

+2

Es fasziniert mich, dass es keine Suche nach Artikel-Index-Methode für AVQueuePlayer gibt. – Morkrom

+0

Darf ich nur fragen, hatten Sie benutzerdefinierte Steuerelemente, um zu erkennen, was der Benutzer gedrückt hat oder haben Sie es irgendwie geschafft, den nächsten Tastendruck von den Standardeinstellungen auf AVQeuePlayer zu erkennen? – schmru

Antwort

20

Wenn Sie möchten, dass Ihr Programm das vorherige Element wiedergeben und das ausgewählte Element aus Ihren Player-Elementen (NSArray) wiedergeben kann, können Sie dies tun.

- (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]; 
     } 
    } 
} 

edit: playerItems ist die NSMutableArray (NSArray), wo Sie Ihre AVPlayerItems speichern.

+0

Danke. Ich habe etwas ähnliches gemacht. Aber am Ende habe ich nur ein Videofile und ein Array mit Zeigern zur Anfangszeit der Kapitel und der seekTo-Funktion verwendet. – Amandir

+1

Wenn Sie dazu neigen, lückenlos zu spielen, scheint Ihre Lösung der einzige Weg zu sein. – saiday

+1

Gibt es das überhaupt, ohne die Warteschlange zu löschen? –

4

Die erste Antwort entfernt alle Elemente aus AVQueuePlayer und repopuliert die Warteschlange beginnend mit der Iteration, die als Index arg übergeben wurde. Dies würde die neu bevölkerte Warteschlange mit dem vorherigen Element (vorausgesetzt, dass Sie den richtigen Index übergeben haben) sowie dem Rest der Elemente in dem vorhandenen playerItems-Array von diesem Punkt an beginnen, ABER es erlaubt nicht mehrere Umkehrungen, z. Sie befinden sich auf Spur 10 und möchten zurückgehen und Spur 9 wiedergeben. Wiederholen Sie dann Spur 5, was Sie nicht erreichen können. Aber hier können Sie ...

-(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

Mit dem folgenden Code können Sie zu einem beliebigen Element in Ihrem springen. Kein Spielerkopf vorrücken. Schlicht und einfach. playerItemList ist Ihr NSArray mit AVPlayerItem-Objekten.

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

das macht Sinn. Aber dann entfernen Sie jedes Mal alles aus der Liste, wenn Sie den indizierten Song abspielen wollen. Warum nicht einfach den AVPlayer in diesem Fall benutzen? Ich habe dir jedoch +1 gegeben –

2

djiovann erstellt eine Unterklasse von AVQueuePlayer, die genau diese Funktionalität bereitstellt.

Sie können es auf github finden.

Ich habe es noch nicht getestet, aber aus dem Durchsuchen des Codes scheint es die Arbeit zu erledigen. Auch der Code ist gut dokumentiert, so sollte es zumindest als eine gute Referenz für eine benutzerdefinierte Implementierung der Funktionalität dienen (ich empfehle, eine Kategorie anstelle von Unterklassen zu verwenden).

0

Wenn Sie einen Song aus einem beliebigen Index mit AVQueuePlayer spielen möchten. Dann kann dieser Code helfen.

Hier PlaySongAtIndex aufrufen, wenn Sie ein Lied spielen möchten.