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ń!
|
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.cat file | grep ...
zamiastgrep ... 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.Odpowiedzi:
Opcje:
raspivid -t 0 -o - | nc -k -l 1234
raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264
cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'
raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234
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=SERVER_IP port=1234
uv4l --driver raspicam
picam --alsadev hw:1,0
Rzeczy do rozważenia
top -d 10
)Porównanie:
źródło
?
”?Tylko nowoczesny sposób, aby strumień H264 do przeglądarki jest z UV4L : brak opóźnienia, brak konfiguracji z opcjonalnym dźwiękiem, opcjonalnie dwukierunkowe audio / wideo. Bez magicznego sosu GStreamer, ale można rozszerzyć jego użycie.
źródło
uv4l
? Mój potok gstreamer wygląda teraz dość przestarzały! Nie mogę się doczekać, aby sprawdzić, jak opóźnienie!1.) Przesyłanie strumieniowe h264es przez sieć (tylko próbka)
na serwerze:
na kliencie:
2.) Streaming mjpeg w sieci (tylko próbka)
na serwerze:
na kliencie:
wszystko to działa nawet na RPi Zero W (skonfigurowanym jako serwer)
źródło
sample only
znaczy?