2015-12-16 22 views
10

Pracuję nad aplikacją, która musi przesłać wideo zakodowane w formacie H.264 w czasie rzeczywistym przez UDP (rodzaj połączenia wideo).Kodowanie H.264 NAL/podział plasterka

Niedawno przeszliśmy na sprzętowy koder, który obsługuje tylko ograniczoną liczbę profili H.264. W rezultacie każda zakodowana klatka wideo składa się teraz z pojedynczego NALu. Dokładniej, w przypadku ramek IDR (klucz) koder generuje SSP, PSP i pojedynczy segment IDR, dla innych - pojedynczy przekrój inny niż IDR.

Teraz moim celem jest podzielenie kawałka NALU na kilka mniejszych, ponieważ w przypadku utraty pakietów, jeśli NALu nie może być kompletnie złożony - jest całkowicie stracony. Co najmniej muszę podzielić wycinek przestrzennie, tj. Umieścić zakresy makrobloków w różnych NALus. Jeśli to możliwe - chciałbym również wyodrębnić warstwy jakości, aby warstwa bazowa mogła być chroniona przez więcej nadmiarowych pakietów (FEC).

Uwaga: nie mówię o transkodowaniu. Chodzi o przepakowywanie/ponowne formatowanie, lokalizowanie fragmentów danych definicji makrobloku i umieszczanie ich w inny sposób.

Próbuję teraz przeanalizować odpowiednie nagłówki danych: SPS, PPS i zakodowane plasterki, wykorzystując zarówno standardowe specyfikacje H.264, jak i niektóre kody dekoderów open source. Zadanie wydaje się możliwe, choć trochę trudne, z wieloma szczegółami technicznymi.

Moje pytanie brzmi: czy jest to znany problem? Czy jest jakieś API/biblioteka, które robi dokładnie to?

+0

Powinieneś opublikować model enkodera sprzętowego, ktoś może wiedzieć, jak go skonfigurować, aby wygenerować NALu mniejszy niż wartość (np. MTU) .W przypadku FEC możesz użyć RTP. Możesz zobaczyć [RFC 6184] (https: // tools .ietf.org/html/rfc6184 # sekcja-6.1) dla typowych reguł pakietowania i [RFC 5109] (https: //tools.i etf.org/html/rfc5109) dla FEC. – aergistal

+0

@aergistal - dzięki, już używamy FEC i przesyłamy przez RTP (używając ffmpeg). Ta sytuacja jest jednak całkowicie lub prawie całkowita, albo cały NALu jest w pełni odzyskiwany, albo nie. Podczas gdy chciałbym mieć kilka mniejszych NALusów, aby móc odzyskać część kadru. – valdo

+1

@valdo Co masz na myśli przez "czy jest to znany problem?" – ARK

Odpowiedz

2

Pytanie brzmi: czy jest to znany problem? Czy jest jakieś API/biblioteka, które robi dokładnie to? "

Nie ma biblioteki API, którą znam, ale wierzę, że można znaleźć rozwiązanie lub blisko rozwiązania tutaj w kodzie źródłowym, które można skompilować do biblioteki z projektu h264bitstream na github: https://github.com/aizvorski/h264bitstream/blob/master/svc_split.c Daj nam znać, jak to działało dla Ciebie.Należy oczywiście zrobić trochę czytania kodu tutaj, ale podstawowe rozwiązanie, lub zbliżone do rozwiązania wydaje się być tam.

Powiązane problemy