iOS 10.0 - 10.1: AVPlayerLayer zeigt kein Video nach der Verwendung von AVVideoCompositionCoreAnimationTool, nur Audio

8

Hier ist ein komplettes Projekt, wenn Sie es selbst ausführen möchten: Ссылка

Dies ist ein neues Problem auf iOS 10, und es wurde ab iOS 10.2 behoben. Nach dem Exportieren eines Videos mithilfe von AVAssetExportSession und AVVideoCompositionCoreAnimationTool, um während des Exports eine Ebene über dem Video zu erstellen, können in AVPlayerLayer wiedergegebene Videos nicht wiedergegeben werden. Dies scheint nicht durch das Erreichen des AV-Codierungs- / Decodier-Pipeline-Limits verursacht zu sein, da dies oft nach einem einzelnen Export geschieht, der, soweit ich weiß, nur 2 Pipelines spinnt: 1 für die AVAssetExportSession und einen anderen für den AVPlayer. Ich stelle auch den Rahmen der Ebene richtig ein, wie Sie sehen können, indem Sie den Code darunter ausführen, der der Ebene einen blauen Hintergrund gibt, den Sie deutlich sehen können.

Nach einem Export scheint es etwas länger zu warten, bevor ein Video abgespielt wird, aber es ist nicht wirklich eine akzeptable Lösung, um es Ihren Benutzern zu sagen.

Irgendwelche Ideen, was das verursacht oder wie ich es reparieren oder umgehen kann? Habe ich etwas vermasselt oder einen wichtigen Schritt oder ein Detail verpasst? Jede Hilfe oder Hinweise auf die Dokumentation werden sehr geschätzt.

%Vor%     
Sami Samhuri 29.09.2016, 01:50
quelle

4 Antworten

5

Die Antwort für mich ist in diesem Fall, das Problem mit AVVideoCompositionCoreAnimationTool zu umgehen, indem Sie eine benutzerdefinierte Video-Compositing-Klasse verwenden, die das AVVideoCompositing -Protokoll implementiert, und eine benutzerdefinierte Zusammensetzungsanweisung, die das AVVideoCompositionInstruction -Protokoll implementiert. Da ich ein CALayer über dem Video überlagern muss, nehme ich diese Ebene in die Kompositionsinstanz auf.

Sie müssen den benutzerdefinierten Compositor auf Ihre Video-Komposition wie folgt einstellen:

%Vor%

und legen Sie dann Ihre benutzerdefinierten Anweisungen fest:

%Vor%

BEARBEITEN: Hier ist ein Arbeitsbeispiel für die Verwendung eines benutzerdefinierten Compositors zum Überlagern einer Ebene in einem Video mithilfe der GPU: Ссылка ... die ursprüngliche Antwort geht weiter unter

Was den Compositor selbst betrifft, können Sie einen implementieren, wenn Sie sich die relevanten WWDC-Sitzungen ansehen und ihren Beispielcode überprüfen. Ich kann den hier geschriebenen nicht veröffentlichen, aber ich benutze CoreImage, um die Verarbeitung von AVAsynchronousVideoCompositionRequest zu erleichtern, und stelle sicher, dass ein OpenGL CoreImage-Kontext für die beste Leistung verwendet wird (wenn du es auf der CPU machst, wird es abgrundtief langsam sein ). Sie benötigen möglicherweise auch einen Pool für die automatische Freigabe, wenn Sie während des Exports eine Speicherauslastungsspitze erhalten.

Wenn Sie eine CALayer wie mich überlagern, dann stellen Sie layer.isGeometryFlipped = true ein, wenn Sie diese Ebene auf eine CGImage rendern, bevor Sie sie an CoreImage senden. Und stellen Sie sicher, dass Sie das gerenderte CGImage von Frame zu Frame in Ihrem Compositor zwischenspeichern.

    
Sami Samhuri 29.09.2016, 21:07
quelle
2

Wir hatten das gleiche Problem bei iOS 10 und 10.1. Sieht zwar wie von iOS 10.2 Beta 3 behoben aus

    
Dimitar08 15.11.2016 03:46
quelle
1

Um auf Sami Samhuris Antwort zu antworten, hier ist ein kleines Beispielprojekt, das ich bearbeitet habe und das eine benutzerdefinierte AVVideoCompositing -Klasse mit benutzerdefinierten Anweisungen verwendet, die AVVideoCompositionInstructionProtocol

implementieren

Ссылка

Mit dem Projekt können Sie ein Wasserzeichen über ein Video platzieren, aber die Idee könnte sich erweitern, um alles zu tun, was Sie brauchen. Dies verhindert, dass der fragliche AVPlayer-Fehler auftaucht.

Eine weitere interessante Lösung in einem separaten Thread, die helfen könnte: AVPlayer-Wiedergabe schlägt fehl, während AVAssetExportSession ab iOS 10 aktiv ist

    
kleezy 16.11.2016 22:37
quelle
0

Ich habe dieses Problem auf iOS 10.1 erkannt und das Problem wurde auf iOS 10.2 behoben. Eine Möglichkeit, dieses Problem unter iOS 10.1 zu lösen, besteht darin, einige Sekunden zu verzögern, um die PlayerLayer zu Ihrer Container-Ebene hinzuzufügen.

    
Chuyang 10.01.2017 10:29
quelle

Tags und Links