Mam Pi B + i kamerę Pi i teraz próbuję znaleźć najbardziej wydajną konfigurację (niski procesor) i najniższe opóźnienie, aby przesyłać strumieniowo wideo zakodowane w H.264 z kamery na mój domowy serwer.
Przeczytałem następujące:
(Wszystkie linki używają gstreamer-1.0 z deb http://vontaene.de/raspbian-updates/ . main
.)
W ostatnich latach wiele zrobiono w tym zakresie.
Początkowo musieliśmy przesyłać dane wyjściowe raspivid
do gst-launch-1.0
(patrz link 1).
Następnie (link 2) został utworzony oficjalny sterownik V4L2, który jest teraz standardem i pozwala na bezpośrednie uzyskiwanie danych bez potoku, przy użyciu tylko gstreamer (patrz zwłaszcza post przez towolf »Sat Dec 07, 2013 3:34 pm w linku 2):
Nadawca (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000
Odbiorca: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Jeśli dobrze rozumiem, oba sposoby wykorzystują GPU do dekodowania H264, ale ten ostatni jest nieco bardziej wydajny, ponieważ nie musi przechodzić przez jądro innym razem, ponieważ nie ma potoku między zaangażowanymi procesami.
Teraz mam kilka pytań na ten temat.
Czy ten ostatni jest wciąż najnowszym sposobem na efektywne pobieranie H264 z aparatu? Czytałem o tym
gst-omx
, co pozwala na takie rurociągi gstreamer... video/x-raw ! omxh264enc ! ...
. Czy to robi coś innego niż tylko używanievideo/x-h264
, czy może nawet jest bardziej wydajne? Co za różnica?Jak dowiedzieć się, jaka wtyczka kodująca gstreamer jest faktycznie używana, gdy korzystam z
video/x-h264 ...
potoku? Wydaje się, że to tylko określenie pożądanego formatu w porównaniu z innymi częściami potoku, w których wyraźnie nazywam składnik (kod) (jakh264parse
lubfpsdisplaysink
).W tej odpowiedzi do linku 1 Mikael Lepistö wspomina: „Usunąłem jedno niepotrzebne hasło filtru ze strony przesyłania strumieniowego” , co oznacza, że wyciął
gdppay
igdpdepay
. Co oni robią? Dlaczego są potrzebne? Czy naprawdę mogę je zdjąć?Wspomina również, że określając
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
parametry poudpsrc
stronie odbierającej, może rozpocząć / wznowić transmisję strumieniową w środku strumienia. Co osiągają te ograniczenia, dlaczego te konkretne wybory, gdzie mogę przeczytać o nich więcej?Kiedy robię to, co sugeruję w pytaniach 3 i 4 (dodawanie
caps
, upuszczaniegdppay
igdpdepay
), wtedy moje opóźnienie wideo staje się znacznie gorsze (i wydaje się, że się kumuluje, opóźnienie wzrasta z czasem, a po kilku minutach wideo zatrzymuje się)! Dlaczego tak może być? Chciałbym uzyskać opóźnienie uzyskane dzięki oryginalnemu poleceniu, ale mam również możliwość dołączenia do strumienia w dowolnym momencie.Czytałem, że RTSP + RTP zwykle używają kombinacji TCP i UDP: TCP do komunikatów kontrolnych i innych rzeczy, których nie można zgubić, oraz UDP do rzeczywistej transmisji danych wideo. Czy w powyższych konfiguracjach faktycznie tego używam, czy tylko używam tylko UDP? Nie jest dla mnie jasne, czy gstreamer się tym zajmuje, czy nie.
Byłbym wdzięczny za odpowiedź na choćby jedno z tych pytań!
cat file | grep ...
zamiast grep ... file
. Rura dodaje kolejną warstwę kopiowania do iz jądra, którą można łatwo zmierzyć, szczególnie na urządzeniach o niskiej przepustowości pamięci. Jeśli gstreamer może bezpośrednio odczytać z pliku urządzenia, dlaczego tego nie użyć? Jeśli chodzi o twoją raspivid | cvlc
sugestię: korzystałem z tego, zanim przełączyłem się na rozwiązanie oparte na gstreamer, ma ono do 3 sekund dłuższe opóźnienie niż gstreamer (nie wiem dlaczego).
cvlc
zużywa ~ 45%, ale samo przepuszczenie przez rurkę z tą szybkością danych (pamiętając, że rura nie spowalnia ) ledwo poruszyłoby igłę, tak myślę. Jak <5%. Oczywiście nie jest to zupełnie nieistotne, jeśli chcesz to zrobić tak skutecznie, jak to możliwe, oczywiście ...
raspivid | cvlc
który wynosi 40-50%. Ludzie mogą lepiej odpowiadać na pytania, które zmuszają ich do poprawy konkretnej liczby. W tej chwili zadajesz wiele pytań, nie wyjaśniając, dlaczego każdy z nich jest istotny.
|
stwarza jakiekolwiek problemy w tym kontekście, jest niesamowitym kawałkiem BS. Czy próbowałeś już jakichśraspivid | cvlc
metod? Nie miałem kamery zbyt długo lub zbyt długo, żeby się nią bawić, ale używanie jej do tworzenia strumienia http (widocznego na linuksie na drugim końcu w /vlc
) wydaje się działać dobrze.