AVAssetWriterInput H.264 Passthrough zu QuickTime (.mov) - SPS / PPS übergeben, um ein avcC-Atom zu erstellen?

Ich habe einen Stream von H.264 / AVC-NALs, der aus den Typen 1 (P-Frame), 5 (I-Frame), 7 (SPS) und 8 (PPS) besteht. Ich möchte sie in eine MOV-Datei schreiben, ohne sie neu zu codieren. Ich versuche es zu benutzenAVAssetWriter um dies zu tun. Die Dokumentation fürAVAssetWriterInput Zustände:

Wenn Sie nil für outputSettings übergeben, wird die Eingabe angewiesen, die angehängten Beispiele zu durchlaufen und keine Verarbeitung durchzuführen, bevor sie in die Ausgabedatei geschrieben werden. Dies ist nützlich, wenn Sie beispielsweise Puffer anhängen, die bereits in einem gewünschten komprimierten Format vorliegen. Passthrough wird derzeit jedoch nur beim Schreiben in QuickTime-Filmdateien unterstützt (d. H., Der AVAssetWriter wurde mit AVFileTypeQuickTimeMovie initialisiert). Für andere Dateitypen müssen Sie Ausgabeeinstellungen angeben, die nicht Null sind.

Ich versuche, CMSampleBuffers aus diesen NALs zu erstellen und sie an die Asset-Writer-Eingabe anzuhängen, kann die Daten jedoch nicht auf eine Weise eingeben, die eine wohlgeformte MOV-Datei ergibt, und ich kann nirgendwo einen Hinweis finden wie das geht.

Das beste Ergebnis, das ich bisher erzielt habe, war die Übergabe der NALs im Anhang B-Byte-Stream-Format (in der Reihenfolge 7 8 5 1 1 1 ...) und die Wiedergabe des Ergebnisses in VLC. Aus diesem Grund weiß ich, dass die NALs gültige Daten enthalten. Da die .mov-Datei jedoch kein avcC-Atom enthielt und das mdat-Atom mit einem Anhang-B-Byte-Stream gefüllt war, spielt QuickTime das Video nicht ab.

Jetzt versuche ich, die NALs mit einem 4-Byte-Wert (wie vomlengthSizeMinusOne Feld) Länge Feld anstelle des Begrenzers in Anhang B. So sollen sie meines Wissens in das mdat-Atom gepackt werden.

Ich weiß nicht, wie ich den Asset Writer dazu bringen kann, ein avcC-Atom zu schreiben. Jedes Sample, das ich anhänge, wird einfach in das mdat-Atom geschoben.

Weiß jemand, wie ich rohe H.264-Daten an einen AVAssetWriterInput übergeben kann, der für die Weiterleitung konfiguriert ist (keine Ausgabeeinstellungen), und eine ordnungsgemäß geformte QuickTime-Datei erstellen kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage