2012-07-18 33 views
13

Środowisko:konwersji H.264 z FFmpeg (ze strumienia RTP)

mam kamery IP, który jest zdolny do przesyłania strumieniowego To dane przez RTP w formacie H.264 zakodowane. Ten nieprzetworzony strumień jest rejestrowany z sieci Ethernet. Dzięki tym danym muszę pracować.

Cel:

W końcu chcę mieć plik * .mp4, które mogę grać z typowych odtwarzaczy multimedialnych (takich jak VLC lub Windows MP).

Co zrobiłem do tej pory:

Biorę że dane surowy strumień mam i analizować je. Ponieważ dane przesyłane są przez RTP, muszę zająć się NAL Bytes, SPS i PPS.

1. Napisz surowy plik

Najpierw określić typ każdej ramce otrzymał over Ethernet. Aby to zrobić, parsuję pierwsze dwa bajty każdego ładunku RTP, więc mogę uzyskać 8 bitów jednostki NAL, fragmenty typu fragmentu i bit początkowy, zarezerwowany i końcowy. W polu danych, są one ułożone tak:

Byte 1: [   3 NAL Unit Bits   | 5 Fragment Type Bits] 
Byte 2: [Start Bit | Reserved Bit | End Bit | 5 NAL Unit Bits] 

Z tego można ustalić:

  • Start i Koniec ramkę video -> Start i Koniec Bit Bit
  • Rodzaj ładunek -> 5 fragment Rodzaj Bity
  • NAL Jednostka Byte

fragmentu typy, które są niezbędne w mój przypadek to:

Fragment Type 7 = SPS 
Fragment Type 8 = PPS 
Fragment Type 28 = Video Fragment 

NAL Byte jest tworzony przez umieszczenie bity NAL urządzenie z Byte 1 i 2 razem.

Teraz w zależności od rodzaju fragmentacji I wykonaj następujące czynności:

SPS/PPS:

  1. Wpisz NAL Prefiks (0x00 0x00 0x01), a następnie dane SPS lub PPS

Fragmentacja z bit startu

  1. Zapis NAL Prefiks
  2. Zapis NAL Byte Jednostka
  3. aktualizujące pozostałe dane surowe

Fragmentacja bez bit startu

  1. Napisz surowych danych

Oznacza to mój surowy plik wygląda na coś li ke to:

[NAL Prefix][SPS][NAL Prefix][PPS][NAL Prefix][NAL Unit Byte][Raw Video Data][Raw Video Data]....[NAL Prefix][NAL Unit Byte][Raw Video Data]... 

Dla każdego PPS oraz SPS znajdę w moich danych strumienia, po prostu napisać NAL Prefiks (0x00 0x00 0x01), a następnie SPS/sama PPS.

Teraz nie mogę odtwarzać te dane z jakiegoś odtwarzacza multimedialnego, który prowadzi mnie do:

2. Konwersja pliku

Ponieważ chciałem uniknąć pracuje dużo z kodekami Właśnie poszedł użyć istniejącej aplikacji -> FFmpeg. Ten Wołam z tymi parametrami:

ffmpeg.exe -f h264 -i <RawInputFile> -vcodec copy -r 25 <OutPutFilename>.mp4

-f h264: To powinno powiedzieć ffmpeg Mam h264 zakodowany strumień

-vcodec copy: Cytat z podręcznika:

Force video codec to codec. Use the "copy" special value to tell that the raw codec data must be copied as is.

-r 25 : Ustawia szybkość klatek na sekundę na 25 FPS.

Kiedy zadzwonić ffmpeg z tych parametrów dostaję .mp4 które mogę grać z VLC i Windows MP, więc to rzeczywiście działa. Ale plik wygląda teraz nieco inaczej niż mój surowy plik.

To prowadzi mnie do mojego pytania:

Co ja właściwie zrobić?

Moim problemem nie jest to, że nie działa. Po prostu chcę/muszę wiedzieć, co faktycznie zrobiłem z wywołaniem ffmpeg. Miałem surowy plik H264 które nie mógł zabaw.Po użyciu FFmpeg I można odtworzyć.

Istnieją następujące różnice pomiędzy oryginalnym pliku RAW (który pisałem) i jeden napisany przez FFmpeg:

  1. nagłówka: plik FFmpeg ma jak około 0x30 bajtów nagłówka
  2. stopka: FFmpeg Plik posiada również stopkę
  3. Zmieniono prefiks i 2 nowe bajtów:

Choć nowa ramka wideo z Raw File zaczęło się [NAL Prefix][NAL Unit Byte][Raw Video Data] w nowym pliku wygląda tak:

[0x00 0x00][2 "Random" Bytes][NAL Unit Byte][Raw Video Data].....[0x00 0x00[2 other "Random" Bytes][NAL Unit Byte][Raw Video Data]... 

Rozumiem, że film Stream potrzebuje formatu pojemnika (poprawcie mnie jeśli się mylę, ale zakładam, że nowy nagłówek i stopka są odpowiedzialne za to). Ale dlaczego właściwie zmienia niektóre bajty w surowych danych? Nie może to być dekodowanie, ponieważ sam strumień powinien zostać zdekodowany przez odtwarzacz, a nie ffmpeg.

Jak widać, nie potrzebuję nowego rozwiązania dla mojego problemu, o wiele więcej wyjaśnień (aby móc to wyjaśnić samodzielnie). Co właściwie robi ffmpeg? I dlaczego zmienia niektóre bajty w danych wideo?

+1

Czy byłeś w stanie to osiągnąć? Jeśli tak, czy chcesz podzielić się rozwiązaniem? Dzięki! –

Odpowiedz

0

Wygląda na to, że strumień został spakowany. Wiele formatów kontenerów dzieli strumień bitów na pakiety i dodaje trochę informacji, takich jak sygnatury czasowe, długość pakietu itp. Daje to przechwytywanie dekodera, aby pominąć plik bez dekodowania wszystkiego, zsynchronizować się, gdy pakiet zostanie utracony, zsynchronizować audio/wideo, łącząc wiele strumieni itp

Spójrz na plik o formacie MP4 więcej informacji:
http://en.wikipedia.org/wiki/MPEG-4_Part_14

2

Oprócz dodawania kontenera MP4, H.264 ffmpeg przekształcone Twój Załącznik B strumień bajtów (z Przedrostki NAL) do formatu z prefiksami długości.

Twoje [0x00 0x00] [2 "Losowe" Bajty] to 32-bitowa liczba całkowita, która podaje długość następującej jednostki NAL w bajtach.

-1

Możesz przeczytać więcej o swoich zmianach w open h264 specs. Rozdział Załącznik B.

Powiązane problemy