GStreamer Bogdan Kreczmer bogdan.kreczmer@pwr.edu.pl Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska Kurs: Copyright c 2016 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową.
Niniejsza prezentacja została wykonana przy użyciu systemu składu PDFL A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net
1 GStreamer 2 RTP Real-time Transport Protocol Real-time Transport Control Protocol 3 Bins for sessions
ogólnie GStreamer
Potoki GStreamer
Komunikacja GStreamer
Elementy GStreamer
Pojemniki GStreamer
Czym jest protokół RTP Real-time Transport Protocol Real-time Transport Control Protocol RTP (Real-time Transport Protocol) jest to protokół transmisji w czasie rzeczywistym. Pakiet protokołu RTP zawiera informacje takie jak: typie przesyłanych danych, numer seryjny, znacznik czasu. RTP nie gwarantuje jakości usługi (QoS). Używa on zazwyczaj jako protokołu warstwy transportowej protokołu UDP. Podstawowym obszarem zastosowań tego typu protokołu jest telefonia internetowa, systemy telekonferencyjne, serwisy telewizji internetowej itd. Protokół ten jest obecnie uznawany jako dominujący standard dla transmisji audio/video w sieciach internetowych.
Podstawowe cechy GStreamer Real-time Transport Protocol Real-time Transport Control Protocol Cechy Kompensacja pulsacji (ang. jitter), Kontrola poprawnej sekwencji przysyłanych pakietów danych, Pozwala na rozsyłanie danych do wielu punktów docelowych (multicast). Motywacja Aplikacje multimedialne tolerują częściową utratę danych. Np. utrata jednej 0,1s nagrania przy dobrych algorytmach maskujących dla odbiorcy końcowego, ta utrata może być w ogóle niezauważalna. W tego typu aplikacjach prefereuje się szybkość dostarczenia danych niż pewność ich otrzymania. Z tego powodu preferowany jest protokół UDP niż TCP.
Struktura pakietu GStreamer Real-time Transport Protocol Real-time Transport Control Protocol Struktura pakietu VoIP RTP Nagłówek Nagłówek Nagłówek Zawartość IP UDP RTP RTP Protokół RTP może być uważany jako podwarstwa warstwy transportowej. a Z punktu widzenia programisty, RTP może być postrzegany jako część warstwy aplikacji. a http://www.grc.upv.es/docencia/tra/referencias/mmprotocols/rtp.htm
Czym jest protokół RTP Real-time Transport Protocol Real-time Transport Control Protocol RTCP (Real-time Transport Control Protocol) jest to siostrzany protokół w stosunku do protokołu RTP. Wspiera on go dzięki mechanizmom sterującym. Dostarcza również informacji statystycznej. Protokół RTCP opiera się na okresowej transmisji pakietów kontrolnych do wszystkich uczestników sesji. Kodowanie i autoryzacja RTCP nie dostarcza żadnych mechanizmów kodowania i autoryzacji połączenia. Tego typu mechanizmy realizowane są przez inne protokoły takie jak SRTP (Secure Real-time Transport Protocol).
Funkcje protokołu RTCP Real-time Transport Protocol Real-time Transport Control Protocol Podstawowe zadania: Dostarcza zwrotnej informacji odnośnie poprawności odebranych danych. Pozwala to na monitorowanie jakości usług i ewentualną adaptację metody kodowania. Przenosi stały identyfikator transportowy źródła protokołu RTP tzw nazwą kanoniczną (CNAME) do wszystkich danej sesji. Oczekuje się, że identyfikator źródła będzie unikalny. Jednak powiązanie źródła z punktem docelowym może się zmieniać w trakcie trwania sesji. CNAME dostarcza unikalnego identyfikatora dla danej instancji aplikacji. Umożliwia dopasowanie częstotliwość wysyłanych pakietów kontrolnych do liczby użytkowników sesji, Opcjonalnie przenosi zminimalizowaną informację kontrolną sesji, np. wyświetlanie identyfikatora użytkownika (nadawcy) na ekranie monitora odbiorcy pakietów.
Typy komunikatów GStreamer Real-time Transport Protocol Real-time Transport Control Protocol Rodzaje komunikatów SR (Sender Report) jest przesyłany periodycznie przez nadawcę/nadawców, aby przekazać i odebrać statystykę przesyłanych pakietów. Przesyłany raport zawiera znacznik czasu, co umożliwia zsynchronizowanie np. pakietów video i audio. RR (Receiver Report) przyjmowanie statystyki od uczestników sesji nie będących aktywnymi nadawcami. SDES (Source Description) przekazuje opis źródła wraz z danymi, które umożliwiają jego identyfikację. Jest wykorzystywany do przesłania identyfikatora CNAME. BYE zakończenie udziału w sesji. APP specyficzne komunikatay dla danej aplikacji. Pozwala to na tworzenie rozszerzeń protokołu RTCP.
Komunikacja GStreamer Real-time Transport Protocol Real-time Transport Control Protocol Wykorzystanie portów W typowej konfiguracji wykorzystującej protokoły RTP i RTCP zakłada się, że transmisja z wykorzystaniem protokołu RTP jest realizowana przez port UDP o parzystym numerze, zaś transmisja RTCP przez port o numerze o jeden większy od portu z transmisją z protokołem RTP.
GstRtpSession Ogólny opis Bins for sessions GObject +----GstObject +----GstElement +----GstRtpSession GstRtpSession jest menadżer sesji RTP, który modeluje pojedynczego użytkownika z unikalnym SSRC (Synchronization Source Identifier) w danej sesji RTP. Sesja ta może być użyta do odbioru pakietów RTP i RTCP. W zależności od tego jakiego typu łączówki (ang. pad) są żądane w trakcie tworzenia połączenia do elementów, powoduje to aktywowanie odpowiednich funkcjonalności. Zadania realizowane przez menadżera GstRtpSession Weryfikacja pakietów RTP na podstawie ich kolejnych numerów, Utrzymywanie bazy identyfikatorów SSRC uczestników sesji, Zbieranie statystyk dla każdego uczestnika sesji na podstawie pakietów RTCP. Utrzymywanie harmonogramu (ang. scheduling) pakietów RR/RS RTCP.
GstRtpSession Funkcjonalności Bins for sessions GObject +----GstObject +----GstElement +----GstRtpSession Użycie GstRtpSession do odbioru pakietów RTP należy zażądać łączówki recv rtp sink, automatycznie zostanie wygenerowana łączówka recv rtp src. Użycie GstRtpSession do odbioru pakietów RTCP należy zażądać łączówki recv rtcp sink, automatycznie zostanie wygenerowana łączówka sync src. Odbierane pakiety będą użyte do aktualizacji statystyk i bazy uczestników sesji. Użycie GstRtpSession do nadawania pakietów RTCP należy zażądać łączówki send rtcp sink, automatycznie zostanie wygenerowana łączówka send rtcp src. Użycie GstRtpSession do nadawania pakietów RTP należy zażądać łączówki send rtp sink, automatycznie zostanie wygenerowana łączówka send rtp src.
GstRtpSsrcDemux Ogólny opis Bins for sessions GObject +----GstObject +----GstElement +----GstRtpSsrcDemux GstRtpSsrcDemux jest demultiplekserem dla pakietów protokołu RTP. Do demultipleksowania pakietów wykorzystywany jest identyfikator SSRC (Synchronization Source Identifier). Podstawowym celem GstRtpSsrcDemux jest ułatwienie odbioru pakietów RTP w strumieniu z różnymi SSRC. Funkcjonalności: Jeżeli w strumieniu zostanie wykryty nowy SSRC, to tworzona jest łączówka (pad) new-src-pad i emitowany jest sygnał.
GstRtpPtDemux Ogólny opis Bins for sessions GObject +----GstObject +----GstElement +----GstRtpPtDemux GstRtpPtDemux jest demultiplekserem dla pakietów protokołu RTP. Do demultipleksowanie pakietów realizowane jest na podstawie typu jego zawartości. Funkcjonalności: Jeżeli w strumieniu zostanie wykryty nowy typ pakietu, to tworzona jest łączówka (pad) new-payload-type i emitowany jest sygnał.
GstRtpJitterBuffer Ogólny opis Bins for sessions GObject +----GstObject +----GstElement +----GstRtpJitterBuffer GstRtpJitterBuffer składuje i usuwa duplikujące się odebrane pakiety RTP. Czeka też przez ustalony limit czasu na brakujące pakiety. Pakiety, które przyjdą zbyt późno uważane są za utracone. Aktywność tego elementu wprowadza pewne opóźnienie w potoku przetwarzającym pakiety. Aby oszacować swoje opóźnienie potrzebuje on częstotliwość zegara zawartości pakietów RTP.
GstRtpBin Ogólny opis Bins for sessions GObject +----GstObject +----GstElement +----GstBin +----GstRtpBin GstRtpBin Łączy w sobie funkcje elementów GstRtpSession, GstRtpSsrcDemux, GstRtpJitterBuffer i GstRtpPtDemux. Pozwala na tworzenie wielu sesji RTP, które są synchronizowane razem pakietami RTCP SR. GstRtpBin jest konfigurowany poprzez żądanie udostępnienia łączówek, które definiują i aktywują odpowiednie funkcjonalności, analogicznie jak to jest w przypadku elementu GstRtpSession.
Bins for sessions GstRtpBin Opis działania: odbiorca pakietów RTP GObject +----GstObject +----GstElement +----GstBin +----GstRtpBin Załóżmy, że chcemy użyć GstRtpBin jako odbiorcę pakietów RTP. Należy wówczas zażądać łączówki recv rtp sink %d. Numer sesji musi być wyspecyfikowany w nazwie łączówki. (recv rtp sink %d GstRtpSession): dane łączówki są dostarczne do menadżera GstRtpSession. (GstRtpSession): przetwarza i dokonuje weryfikacji, po czym przekazuje dalej. (GstRtpSsrcDemux): każdy strumień jest demultipleksowany w oparciu o identyfikatory SSRC, a następnie przesyłany dalej. (GstRtpJitterBuffer): wygładza strumień/strumienie i przesyła dalej. (GstRtpPtDemux): demultipleksuje strumienie w oparciu o typ ich zawartości pakietów RTP. Dla każdego indywidualnego rozdzielonego strumienia tworzone są łączówki recv rtp src %d %d %d.
Bins for sessions GstRtpBin Opis działania: odbiorca pakietów RTCP GObject +----GstObject +----GstElement +----GstBin +----GstRtpBin Odbiorca RTCP Załóżmy, że chcemy użyć GstRtpBin jako odbiorcę pakietów RTCP. Należy wówczas zażądać łączówki recv rtcp sink %d. Numer sesji musi być wyspecyfikowany w nazwie łączówki. Nadawca RTCP Jeżeli chcemy aby menadżer sesji generował i wysyłał pakiety RTCP, to należy zażądać łączówki recv rtcp src %d z odpowiednim numerem sesji. Pakiety wysyłane przez tę łączówkę będą zawierały raporty SR/RR RTCP. Powinny one być przesłane do wszystkich uczesników danej sesji.
Bins for sessions GstRtpBin Opis działania: nadawca pakietów RTP GObject +----GstObject +----GstElement +----GstBin +----GstRtpBin Załóżmy, że chcemy użyć GstRtpBin jako nadawcę pakietów RTP. Należy wówczas zażądać łączówki send rtp sink %d. Numer sesji musi być wyspecyfikowany w nazwie łączówki. Powyższe żądanie spowoduje automatyczne utworzenie łączówki send rtp src %d. Jeżeli numer sesji nie jest jawnie wyspecyfikowany, to zostanie udostępniona łączówka sesji o najniższym numerze. Przekazywane do menadżera sesji pakiety będą modyfikowane poprzez wstawienie przez niego własnego identyfikatora SSRC i w takiej postaci będą dalej przekazywane na wyjściową łączówkę send rtp src %d.
Bins for sessions GstX264Enc Plugin: x264enc (Ugly) GObject +----GstObject +----GstElement +----GstX264Enc GstX264Enc koduje surowy strumień video w skompresowany format H264, znany również jako MPEG-4 AVC (Advanced Video Codec). Ma możliwość ustawienia około 28 parametrów. Wybrane parametry: pass kontroluje typ kodowania. Domyślnie: Constant Bitrate Encoding. bitrate szybkość bitowa w kbit/s. threads ilość wątków użytych przez kodek.
GstX264Enc Przykłady użycia GObject +----GstObject +----GstElement +----GstX264Enc Bins for sessions gst-launch -v videotestsrc num-buffers=1000! x264enc qp-min=18!\ avimux! filesink location=videotestsrc.avi gst-launch -v v4l2src device="/dev/video1"!\ video/x-raw-yuv,width=320,height=240,framerate=10/1!\ x264enc qp-min=18! avimux! filesink location=videotestsrc.avi
Bins for sessions GstRtpH264Pay Plugin: x264enc (Good) GObject +----GstObject +----GstElement +----GstBaseRTPPayload +----GstRtpH264Pay GstRtpH264Pay zakodowany strumień w formacie H264 konwertuje do pakietów RTP.
Bins for sessions GstRtph264Depay Plugin: rtph264depay (Good) GObject +----GstObject +----GstElement +----GstBaseRTPDepayload +----GstRtpH264Depay GstRtpH264Depay wydobywa z pakietów RTP zakodowany strumień w formacie H264.
Koniec prezentacji Dziękuję za uwagę