Mam surowy H.264 strumień z kamery IP pakowane w ramkach RTP. Chcę uzyskać surowe dane H.264 w pliku, aby móc go przekonwertować na ffmpeg
.H.264 nad RTP - Określenie SPS i PPS ramek
Więc kiedy chcemy zapisać dane do mojego surowego pliku H.264 I okazało się, że musi wyglądać następująco:
00 00 01 [SPS]
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1] // Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received] // From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....
Więc uzyskać SPS
i PPS
z Session Description Protocol
z mojego poprzedzające komunikację RTSP
. Dodatkowo kamera wysyła SPS
i PPS
w dwóch pojedynczych wiadomościach przed rozpoczęciem samego strumienia wideo.
Więc przechwytywania komunikatów w tej kolejności:
1. Preceding RTSP Communication here (including SDP with SPS and PPS)
2. RTP Frame with Payload: 67 42 80 28 DA 01 40 16 C4 // This is the SPS
3. RTP Frame with Payload: 68 CE 3C 80 // This is the PPS
4. RTP Frame with Payload: ... // Video Data
Potem przyszedł kilka ramek z ładowność i w pewnym momencie ramce RTP z Marker Bit = 1
. Oznacza to (jeśli mam rację), że mam pełną klatkę wideo. Afer to piszę Sequence prefiksu (00 00 01
) i NAL
z ładunkiem i znowu iść dalej z tą samą procedurą.
Teraz mój aparat przesyła mi po każdych 8 kompletnych ramkach wideo SPS
i PPS
ponownie. (Znowu w dwóch Ramkach RTP, jak widać w powyższym przykładzie). Wiem, że szczególnie PPS
może zmieniać pomiędzy strumieniowaniem, ale to nie problem.
Moje pytania są teraz:
1. Czy muszę pisać SPS/PPS co 8 klatki wideo?
Jeśli moja SPS
i mój PPS
nie zmieni to powinno wystarczyć mieć napisane na samym początku mojego pliku i nic więcej?
2. Jak odróżnić SPS/PPS i normalnej RTP Frames?
W moim C++ Code, który analizuje przesyłane dane, potrzebuję zrobić różnicę między ramkami RTP z normalnym ładunkiem, a tymi niosącymi SPS/PPS
. Jak mogę je odróżnić? Dobrze, że klatki SPS/PPS
są zwykle dużo mniejsze, ale nie jest to połączenie, na którym można polegać. Ponieważ jeśli je zignoruję, muszę wiedzieć, które dane mogę wyrzucić, lub jeśli muszę je zapisać, muszę umieścić przed nimi prefiks 00 00 01
. ? Czy jest to ustalona reguła, że występują one co 8 klatek wideo?
Dziękuję za to pytanie. Mam takie samo pytanie jak ty. Czytam kod źródłowy live555 i nie wiem, dlaczego zapisują każdy taki pakiet/ramkę. Po przeczytaniu tego wątku sprawy stają się dla mnie jasne. Jako sugestię opartą na implementacji live555, bit znacznikowy jest używany tylko w innych kodekach, H264 ma własne wartości początkowe i końcowe, które reprezentują początek/koniec ramki, bit znacznikowy nie jest używany dla H264. – user534498