2015-12-22 16 views
5

Ich erstelle eine Videoexportfunktion für eine meiner Apps. Im Wesentlichen ist das Video eine Serie von einem von sechs verschiedenen Bildern, die für unterschiedliche (kurze) Dauer dauern.Unbekannter zugrunde liegender OSStatus-Fehler -16364 bei Verwendung von AVAssetWriter

Der Export funktioniert gut, wenn ich etwas mit 283 Bildern unterschiedlicher Dauer exportieren, aber wenn ich einen von 803 zu exportieren versuche, bekomme ich den gefürchteten Fehler "Die Operation konnte nicht abgeschlossen werden" (AKA "wir haben keine Ahnung was gerade in die Luft gejagt, weil AVFoundation Fehlerberichte schrecklich sind ").

Ich kann
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x17ab2050 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16364)} 

nicht:

Wenn ich versuche, den 754. Rahmen (immer der 754. Frame) mit meinem AVAssetWriterInputPixelBufferAdaptor, appendPixelBuffer:withPresentationTime: kehrt NO, die AVAssetWriter des Status dieser ausgefallen ist und seine Fehler hinzufügen Für das Leben von mir herauszufinden, was dieser zugrunde liegende Fehler (OSStatus -16364) ist. www.osstatus.com hat keine Ahnung, macerror sagt, dass keine solche Sache existiert, und this Python-Skript zum Suchen der SDK-Header findet nichts. Es ist auch kein Vier-Zeichen-Code wie einige OSStatus-Fehler (es sei denn, ich habe es versaut, dies zu überprüfen).

Ich habe jede gemeinsame Ursache von "Die Operation kann nicht abgeschlossen werden" Fehler, die ich gefunden habe ausgeschlossen. Es bezieht sich nicht auf Dateisystemberechtigungen oder das Überschreiben, zwei Aufrufe von appendPixelBuffer haben dieselbe Präsentationszeit.

Es ist keine Erinnerung Sache (Speicherverbrauch bleibt bei 165MB während Video-Export flach), und CPU bleibt in der Nähe von 3%.

Wenn es von Bedeutung ist, verwende ich dieselben 6 CVPixelBuffer s immer und immer wieder für die 6 Bilder, anstatt jedes Mal neue von UIImage s zu erstellen. Dies scheint die Performance zu verbessern, und jedes Mal, wenn man sie in neue ändert, scheint sich nichts zu ändern (außer, dass sie stattdessen auf Frame 753 fehlschlägt), aber wer weiß.

Hat jemand eine Idee, was das sein könnte?

+0

vielleicht hilft dir das https://github.com/BradLarson/GPUImage/issues/2135 – azimov

+0

@azimov: Ich benutze kein GPUImage, aber vielleicht bringt mich das Fixieren mit Threading irgendwo hin. Vielen Dank. – Linuxios

+0

Ja, ich habe gesehen, dass es nicht dasselbe ist, aber der Autor zeigt AVAssetWriter in seinen Kommentaren und er erhält denselben Fehlercode wie Sie. – azimov

Antwort

7

OK. Endlich herausgefunden.

Aufgrund der Rundung (Rundung kleiner Dauerwerte in die Zeitskala von 30 FPS, die sie zu 0/30 werden ließen) wurde appendPixelBuffer:withPresentationTime: unter denselben Umständen zweimal mit derselben presentationTime aufgerufen. AVFoundation bemerkte nicht, das Problem bis 7 Frames später, wenn sie den Fehler wirft:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x17ab2050 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16364)} 

Unter Verwendung von 60 FPS anstelle von 30 FPS dieser besondere Situation von Rundung auf eine Null-Dauer verhindert, aber die allgemeine Lösung fallen zu lassen Frames mit Dauern, die auf Null gerundet wurden.

+0

nice - boo zu 'AVFoundation's Fehlermeldungen. Kannst du deine Antwort akzeptieren? –

+0

@RhythmicFistman: Fertig. Sie wissen, dass die Pflege von zwei Apps mit AVFoundation ein Albtraum ist. – Linuxios

+0

Welche Art von Problemen haben Sie? –