AVAssetWriterInput H.264 Przekazywanie do QuickTime (.mov) - Przechodzenie w SPS / PPS w celu utworzenia atomu avcC?

Mam strumień H.264 / AVC NAL składający się z typów 1 (ramka P), 5 (ramka I), 7 (SPS) i 8 (PPS). Chcę je zapisać w pliku .mov bez ponownego kodowania. Próbuję użyćAVAssetWriter aby to zrobić. Dokumentacja dlaAVAssetWriterInput stwierdza:

Przekazanie nil dla outputSettings powoduje, że wejście przechodzi przez dołączone próbki, nie wykonując żadnego przetwarzania, zanim nie zostanie zapisane w pliku wyjściowym. Jest to przydatne, jeśli na przykład dołączasz bufory, które są już w pożądanym formacie skompresowanym. Jednak przekazywanie jest obecnie obsługiwane tylko podczas zapisu do plików filmowych QuickTime (tj. AVAssetWriter został zainicjowany za pomocą AVFileTypeQuickTimeMovie). W przypadku innych typów plików należy określić ustawienia wyjściowe inne niż zero.

Próbuję utworzyć CMSampleBuffers z tych NAL i dodać je do wejścia programu do zapisu zasobów, ale nie mogę wprowadzić danych w sposób, który daje dobrze sformatowany plik .mov i nie mogę znaleźć żadnej wskazówki gdziekolwiek jak to zrobić.

Najlepszy wynik, jaki do tej pory osiągnąłem, to przekazanie NAL w formacie strumienia bajtów załącznika B (w kolejności 7 8 5 1 1 1 .... powtarzanie) i odtworzenie wyniku w VLC. Z tego powodu wiem, że NAL zawierają poprawne dane, ale ponieważ plik .mov nie miał atomu avcC, a atom mdat został wypełniony strumieniem bajtów załącznika B, QuickTime nie odtwarza wideo.

Teraz próbuję przekazać NAL z 4-bajtowym (jak określono przezlengthSizeMinusOne pole) długość pola zamiast ogranicznika załącznika B, w jaki sposób mają być zapakowane do atomu mdat, o ile mi wiadomo.

Nie rozumiem, jak skłonić programistę zasobów do napisania atomu avcC. Każda próbka, którą dołączam, zostaje wepchnięta do atomu mdat.

Czy ktoś wie, w jaki sposób mogę przekazać surowe dane H.264 do AVAssetWriterInput skonfigurowanego do przekazywania (nil outputSettings) i wygenerować poprawnie utworzony plik QuickTime?

questionAnswers(1)

yourAnswerToTheQuestion