Ś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:
- Wpisz NAL Prefiks (
0x00 0x00 0x01
), a następnie dane SPS lub PPS
Fragmentacja z bit startu
- Zapis NAL Prefiks
- Zapis NAL Byte Jednostka
- aktualizujące pozostałe dane surowe
Fragmentacja bez bit startu
- 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:
- nagłówka: plik FFmpeg ma jak około 0x30 bajtów nagłówka
- stopka: FFmpeg Plik posiada również stopkę
- 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?
Czy byłeś w stanie to osiągnąć? Jeśli tak, czy chcesz podzielić się rozwiązaniem? Dzięki! –