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% 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.
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
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
Tags und Links ios video avfoundation ios10