Przesyłanie strumieniowe H264 za pomocą Logitech C920

13

Mam kamerę internetową Logitech C920. Ma możliwość bezpośredniego kodowania wideo w H264.

Chcę odtworzyć to, co zostało zrobione za pomocą Beaglebone, ale używając Raspberry Pi: wyślij strumień H264 do sieci . Raspberry Pi jest wtedy tylko tutaj, aby spakować strumień w RTP, kompresja wideo jest wykonywana przez samą kamerę internetową. Tryb H264 jest wymuszany za pomocą video4linux.

Do tej pory, a jeśli używam wspólnego komputera z najnowszą wersją Ubuntu, działa on za pomocą VLC jako serwera lub GStreamera. Na przykład, jeśli uruchomię na Raspberry Pi serwer VLC za pomocą polecenia:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

... a potem, jeśli czytam strumień z VLC na innym komputerze, wszystko jest w porządku.

Jeśli jednak użyję Raspberry Pi do wysłania strumienia wideo, wynik jest dość słaby. Dużo śmieci na obrazie, gdy tylko coś się poruszy. Klucze obrazu są odbierane co 10 sekund, ale tymczasem nie jest wystarczająco dobry w porównaniu ze strumieniem ze zwykłego komputera.

Wypróbowałem również metodę opisaną dla beaglebone z dostarczonym narzędziem „capture” : ok, jeśli przesyłam strumieniowo z prawdziwego komputera, ten sam problem ze śmieciami, jeśli przesyłam strumieniowo z Raspberry Pi.

To nie jest problem z siecią: wykonałem kilka kontroli sieci z Wireshark i statystykami VLC, nie mam utraty pakietów. Próbowałem z Raspbian i Arch Linux dla Raspi (gstreamer 0.10 w raspbian, gstreamer 1.0 w Arch Linux).

Nie wiem, czy jest to istotne, czy nie, ale testowałem również z wersją Raspbian obsługującą soft float. Najpierw należy wykonać aktualizację, aby móc korzystać z jądra 3.2; ale ten sam problem, wideo ma trochę śmieci.

Masz pomysł, co mogę zrobić, aby poprawić jakość wideo?

Vincent Hiribarren
źródło
Spróbuj zmniejszyć liczbę klatek na sekundę. Procesor rPi jest bardzo słaby, więc myślę, że przesyłanie obrazu 800x600 przy 30 klatkach na sekundę to za dużo. Tylko nowa płyta kamery rPI, która jest podłączona przez złącze MIPI / CIS (zamiast USB), przesyła strumieniowo 1080p przy 15-30 FPS.
Matthias,
To nie jest FPS. Pi może obsługiwać HD przy 60 klatkach na sekundę bez problemu przy użyciu modułu Pi Camera. Jeśli kamera Logitech wyśle ​​wideo H264, jest już zakodowane, a Pi musi ponownie boradcastować pakiety, do których jest w pełni zdolny. W rzeczywistości może ponownie nadawać w górę 6 strumieni HD @ 25FPS, zanim osiągnie maksimum. To musi być sterownik korumpujący pakiety V4L
Piotr Kula,
Wiem, że to stary wątek, ale czy w końcu znalazłeś coś, co działa? Próbuję zrobić coś podobnego i utknąć
Ajith
Użyłem Beaglebone i działało to lepiej. Problem był spowodowany złym sterownikiem USB dla RaspberryPi w Raspbian. O ile pamiętam, później przetestowałem ten sam system z późniejszą wersją Raspbian i miałem mniej śmieci. Może zrobiłem aktualizację rpi (jak powiedziano w jednej z odpowiedzi), ale nie pamiętam dobrze. Ale pewne jest to, że wydajność była lepsza po zastosowaniu zaktualizowanego oprogramowania / systemu operacyjnego.
Vincent Hiribarren
Vincent, pojawia się błąd „nie można otworzyć adresu URL v4l2”. Czy to polecenie jest już nieaktualne?
dalanmiller

Odpowiedzi:

6

Miałem ten sam problem, znalazłem ten wątek podczas wyszukiwania kodera sprzętowego, a nie problemów z C920.

Niemniej jednak, wykonaj aktualizację oprogramowania dla Raspberry Pi i śmieci powinny zniknąć

$> sudo rpi-update

Sam znalazłem rozwiązanie tutaj: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi

Steffen
źródło
Aby zamknąć to pytanie, akceptuję tę odpowiedź. Problem polegał na zepsutym sterowniku USB, nastąpiła utrata pakietów w komunikacji USB. Zaktualizowany system / oprogramowanie układowe powinno załatwić sprawę.
Vincent Hiribarren,
2

Możesz spróbować użyć FFMPEG. Ale problemem nie jest używanie wersji repozytoriów, ponieważ jest przestarzała. Istnieje rozwidlona wersja, która działa naprawdę dobrze.

Będziesz musiał go skompilować, co zajmuje około 5 godzin lub pobrać skompilowany plik binarny.

Za pomocą tych ustawień możesz przesyłać dane ze sterownika V4L do FFMPEG. Tam gdzie -i "fifo"powinno być po prostu -iprzechwycenie potokowego strumienia i -fbędziesz musiał dwukrotnie sprawdzić, jak go wyprowadzić H264. FLV przepakowuje go do FLV, który można odtwarzać za pomocą odtwarzaczy HTML.

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

lub przykład, który znalazłem, który celuje bezpośrednio w V4L, ale oyu musi mieć kamerę w /dev/video* miejscu, gdzie * jest 1lub więcej ...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

-foznacza format na wyjściu. To nie znaczy, że będzie to jak transkodowanie H264 do flv tylko dostaje zapakowane w formacie FLV. następnie zmień adres na odtwarzacz VLC swoich klientów. na przykład-f mpegts udp:192.168.1.19:1234

VLC nie działa zbyt dobrze na Pi. Odniosłem bardzo mały sukces wypychając moduł Pi cmaera na komputer przy użyciu UDP. Działało, ale nie było stabilne.

Możesz także spojrzeć na instalację nginx z modułem rtmp, który działa w leczeniu. Spójrz na ten przewodnik, ale będziesz musiał nieco poprawić ustawienia. Następnie podłącz swój odtwarzacz VLC do strumienia nginx-rtmp i będzie działał jak urok.

Piotr Kula
źródło
1
Która wersja rozwidlona działa dobrze?
Brian
1

To wydaje się działać dla mnie @ przynajmniej ... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy

Philippe Gachoud
źródło
0

Wypróbuj większy bufor na kliencie wyświetlającym wideo. Dla mnie jest dramatyczna różnica między buforem 1000 ms a 200 ms. Bufor 5000 ms wygląda lepiej niż bufor 1000 ms.

: buforowanie sieci = 2000

Odie
źródło
Powinien działać z buforowaniem 0 z dziwnym drganiami w sieci LAN. Mam moduł kamery Pi do pracy bez problemu.
Piotr Kula,
0

Opublikowałem możliwe rozwiązanie na forum malinowym przy użyciu lekkiego serwera RTSP opartego na live555, który przechwytuje H264 ze sterownika V4L2. Jest dostępny z github h264_v4l2_rtspserver

Dokonano tego w przypadku kamery raspicamera, ale powinna ona działać z każdym urządzeniem V4L2, które zapewnia H264.

mpromonet
źródło
-1

Jeśli dobrze zrozumiałem twoją sytuację, chcesz, aby Raspberry transkodował wideo do H264? Myślę, że właśnie dlatego masz niską wydajność, ponieważ VLC używa kodowania programowego, a Raspberry nie jest potężny do tego zadania.

Proponuję wypróbować Gstreamer i gst-omxwtyczki . Jest element do sprzętowego kodowania wideo, który byłby dobrym serwerem z twojego Raspberry.

10robinho
źródło
1
Jak powiedział, kamera Logitech zapewnia już H.264. Tak więc rPi przenosi tylko ramki, ale nie wykonuje żadnego kodowania.
Matthias,
On nie transkoduje. Po prostu ponownie nadaj dane. Jak w tym wykorzystuje bezpośrednio strumień.
Piotr Kula,