Schalt-Videos in AVPlayer Erzeugt Flash Beim Wechsel
Ich bin mit AVFoundation ist AVPlayer zu spielen 2 video-clips aus 1 längeres video (also das Ende des ersten matches am Anfang des zweiten)
Wenn das erste video endet und der Benutzer tippt, erstelle ich einen neuen AVPlayer, und weisen Sie es auf meine PlayerView, und spielen Sie den zweiten clip.
Das alles funktioniert, aber es ist ein Prominente Bildschirm "flimmern".
Meine Vermutung ist, dass dies verursacht wird durch die player-Ansicht entfernen des ersten Clips und dann mit dem zweiten clip.
Was ich brauche, ist für dieses flackern nicht zu erscheinen, so daß man zwischen den beiden clips ist nahtlos.
Tun, wer weiß, ob es ist ein Weg, dies zu stoppen flickr, entweder über die AVPlayer* Klassen, oder einen Weg zu "fälschen", indem Sie Folgendes tun etwas zu machen, so dass dieser nicht sichtbar ist.
Dank
Unten ist der code von meinem laden und spielen Methode:
- (void)loadAssetFromFile
{
NSURL *fileURL = nil;
switch (playingClip)
{
case 1:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3a" withExtension:@"mp4"];
break;
case 2:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3b" withExtension:@"mp4"];
break;
case 3:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3c" withExtension:@"mp4"];
break;
case 4:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3d" withExtension:@"mp4"];
break;
default:
return;
break;
}
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
^{
//The completion block goes here.
NSError *error = nil;
AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];
if (status == AVKeyValueStatusLoaded)
{
self.playerItem = [AVPlayerItem playerItemWithAsset:asset];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
self.player = [AVPlayer playerWithPlayerItem:playerItem];
[playerView setPlayer:player];
[self.player seekToTime:kCMTimeZero];
[self play];
}
else {
//Deal with the error appropriately.
NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]);
}
}];
}
- Haben Sie versuchen, nur die Einstellung der Hintergrundfarbe der Blick hinter die
AVPlayerLayer
zu, sagen wir, schwarz statt weiß? Du tust das richtige in der Einstellung derplayerView
von der alten Spieler auf den neuen, im Gegensatz zu " entfernen/readding es. Die player-Ansicht leer sein irgendwann, da Sie die Festlegung auf das neue player-Instanz vor der Instanz ist bereit zu spielen. Sie könnten versuchen, die Einstellung nur dieplayerView
über, wenn seinestatus
istAVPlayerStatusReadyToPlay
? - waren Sie in der Lage, dieses Problem zu beheben ?
- Siehe die Kommentare für diese Antwort für eine tatsächliche Arbeitszeit impl: stackoverflow.com/a/33335884/763355
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nicht neu erstellen
AVPlayer
für diese Aufgabe. Sie können einfach mehrereAVPlayerItem
s, und wechseln Sie dann, welche ein Strom über[AVPlayer replaceCurrentItemWithPlayerItem:item]
.Können, können Sie auch beobachten, wenn das aktuelle Element geändert hat mit dem code unten.
...
Nach dem erstellen eines Spieler, registrieren die Beobachter:
...
AVPlayers
auf einmal, gibt es eine hardware-Einschränkung von max 4 öffnen Sie auf dem Gerät wie es ist und Sie nicht wollen, machen Sie es schlimmer.AVPlayerItem
scheint zu funktionieren auf dem simulator, aber auf einem Gerät, das ich immer noch den flash.Gibt es zwei workaround den ich gefunden habe. Für mich beide Ansätze gearbeitet, und ich bevorzuge die zweite.
Erstens, wie @Alex Kennberg erwähnt, erstellen Sie zwei Satz
AVPlayerLayer
undAVPlayer
. und schalten Sie beim wechseln zwischen videos. Stellen Sie die Hintergrundfarbe auf Farbe "clear".Zweite, verwenden Sie
UIImageView
als Eigentümer Blick auf denAVPlayerLayer
. Erstellen Sie thumbnail-Bild von einem video und legen Sie es auf die Bildansicht vor der Umschaltung des video. Werden Sie sicher, dass Sie die view-Modus richtig.Ich versuchte dies und es funktionierte für mich.
Aber ich bin auch Zuweisung von meinen eigenen AVPlayerLayer statt mit IB zu tun.
Nach zu vielen versuchen ohne Erfolg habe ich endlich eine Lösung gefunden, nicht die beste, aber funktioniert
Mein Eintrag code ist unten, haben Sie einen Blick auf die loadVideo Methode
CALayer
davon Verschieden ist, die neue Ebene erstellt, und es stürzt ab, nachdem die zusätzlichen Ebenen werden entfernt. Irgendwelche Erkenntnisse?Fand ich eine sehr einfache Lösung (vielleicht zu einfach für einige Leute, aber bei mir funktionierte es):
Im Interface Builder ich legen Sie die Hintergrundfarbe meiner Ansicht (wird mit der video-Ebene befestigt) schwarz. So ist es nur 'Flash', schwarz jetzt...