Streaming H264 avec Logitech C920


13

J'ai une webcam logitech C920. Il a la capacité d'encoder directement la vidéo en H264.

Je veux reproduire ce qui a été fait avec un Beaglebone, mais en utilisant un Raspberry Pi: envoyez un flux H264 au réseau . Le Raspberry Pi n'est alors là que pour packetiser le flux en RTP, la compression vidéo est effectuée par la webcam elle-même. Le mode H264 est appliqué à l'aide de video4linux.

Jusqu'à présent, et si j'utilise un ordinateur commun avec la dernière version d'Ubuntu, cela fonctionne en utilisant VLC comme serveur ou GStreamer. Par exemple, si je lance sur Raspberry Pi un serveur VLC en utilisant la commande:

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

... et puis si je lis le flux avec VLC sur un autre ordinateur, tout va bien.

Cependant, si j'utilise le raspberry Pi pour envoyer le flux vidéo, le résultat est assez médiocre. Beaucoup de déchets dans l'image dès que quelque chose bouge. Les clés d'image sont bien reçues toutes les 10 secondes, mais en attendant, elles ne sont pas assez bonnes par rapport au flux provenant d'un ordinateur commun.

J'ai également essayé la méthode décrite pour le beaglebone avec l' utilitaire "capture" fourni : ok si je diffuse à partir d'un vrai ordinateur, même problème de poubelle si je diffuse à partir d'un Raspberry Pi.

Ce n'est pas un problème de réseau: j'ai fait quelques vérifications de réseau avec Wireshark et les statistiques de VLC, je n'ai pas de perte de paquets. J'ai essayé avec Raspbian et Arch Linux pour Raspi (gstreamer 0.10 dans raspbian, gstreamer 1.0 dans Arch Linux).

Je ne sais pas si c'est pertinent ou non, mais j'ai aussi testé avec la version de support soft float de Raspbian. Une mise à jour doit d'abord être effectuée pour utiliser un noyau 3.2; mais même problème, la vidéo a des ordures.

Une idée sur ce que je pourrais faire pour améliorer la qualité vidéo?


Essayez de réduire la fréquence d'images. Le CPU du rPi est très pauvre, donc je suppose que transmettre une image 800x600 à 30FPS est trop. Seule la nouvelle carte de caméra rPI qui est connectée via le connecteur MIPI / CIS (au lieu d'USB) diffuse 1080p à 15-30 FPS.
Matthias

Ce n'est pas FPS. Le Pi peut gérer la HD à 60FPS sans problème en utilisant le module de caméra Pi. Si la caméra Logitech envoie une vidéo H264, elle est déjà encodée et que le Pi doit retransmettre les paquets .. ce dont il est entièrement capable. En fait, il peut rediffuser jusqu'à 6 flux HD @ 25FPS avant qu'il ne soit au maximum. Ce doit être le pilote V4L corrompant les paquets
Piotr Kula

Je sais que c'est un vieux fil, mais avez-vous finalement trouvé quelque chose qui fonctionne? Im essayant de faire quelque chose de similaire et coincé
Ajith

J'ai utilisé un Beaglebone et cela a mieux fonctionné. Le problème était dû à un mauvais pilote USB pour le RaspberryPi dans Raspbian. Pour autant que je me souvienne, j'ai testé plus tard le même système avec une version plus récente de Raspbian et j'avais moins de déchets. Je peux avoir fait une mise à jour rpi (comme dit dans l'une des réponses), mais je ne me souviens pas bien. Mais ce qui est sûr, c'est que les performances étaient meilleures après avoir utilisé un micrologiciel / système d'exploitation mis à jour.
Vincent Hiribarren

Vincent, je reçois une erreur "Impossible d'ouvrir l'URL v4l2". Cette commande est-elle maintenant obsolète?
dalanmiller

Réponses:


5

J'ai eu le même problème, j'ai trouvé ce fil lors de la recherche d'un encodeur matériel, pas de problèmes c920.

Néanmoins, exécutez une mise à jour du firmware pour le Raspberry Pi et les ordures devraient disparaître

$> sudo rpi-update

J'ai moi-même trouvé la solution ici: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi


Afin de clore cette question, j'accepte cette réponse. Le problème était dû à un pilote USB cassé, il y avait une certaine perte de paquets dans la communication USB. Un système / firmware mis à jour devrait faire l'affaire.
Vincent Hiribarren

2

Vous pouvez essayer d'utiliser FFMPEG. Mais le problème n'est pas d'utiliser la version des référentiels car elle est dépassée. Il existe une version fourchue qui fonctionne très bien.

Vous devrez le compiler en 5 heures environ ou télécharger un binaire précompilé.

Vous pouvez ensuite diriger les données du pilote V4L vers FFMPEG avec ces paramètres. Où le -i "fifo"devrait être juste -ipour capter le flux canalisé et le -fvous aurez besoin de vérifier comment le sortir H264. le FLV le reconditionne en FLV qui peut être lu avec des lecteurs HTML.

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

ou un exmaple j'ai trouvé que les cibles V4L directement mais oyu doivent avoir la caméra présente dans /dev/video* où * est 1ou plus ...

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

le -findique le format de sortie. Cela ne signifie pas qu'il le transcodera comme H264 en FLV est simplement enveloppé au format FLV. puis changez l'adresse pour le lecteur VLC de vos clients. par exemple-f mpegts udp:192.168.1.19:1234

VLC ne semble pas fonctionner trop bien sur le Pi. J'ai eu très peu de succès en poussant le module Pi cmaera sur mon PC en utilisant UDP. Cela a fonctionné mais ce n'était pas stable.

Vous pouvez également regarder installer nginx avec le module rtmp qui fonctionne un régal. Regardez ce guide, mais vous devrez modifier légèrement les paramètres. Vous connectez ensuite votre lecteur VLC au flux nginx-rtmp et cela fonctionnera comme un charme.


1
Quelle version fourchue est celle qui fonctionne bien?
Brian

1

Cela semble fonctionner pour moi @ au moins ... 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


0

Essayez avec un tampon plus grand sur le client affichant la vidéo. Pour moi, il y a une différence spectaculaire entre le tampon de 1000 ms et le tampon de 200 ms. Le tampon de 5000 ms est meilleur que le tampon de 1000 ms.

: mise en cache réseau = 2000


Cela devrait fonctionner avec la mise en cache 0 avec les tremblements étranges sur le LAN.J'ai obtenu le module de caméra Pi pour fonctionner comme ça sans problème.
Piotr Kula

0

J'ai posté une solution possible sur le forum framboise en utilisant un serveur RTSP léger basé sur live555 qui capture H264 à partir d'un pilote V4L2. Il est disponible sur github h264_v4l2_rtspserver

Cela a été fait pour la raspicamera, mais cela devrait fonctionner avec tout appareil V4L2 qui fournit H264.


-1

Si j'ai bien compris votre situation, vous voulez que Raspberry transcode la vidéo en H264? Je pense que c'est pourquoi vous obtenez de mauvaises performances, car VLC utilise l'encodage logiciel et Raspberry n'est pas puissant pour cette tâche.

Je suggère d'essayer avec Gstreamer et les gst-omxplugins . Il y a un élément pour le codage vidéo matériel qui ferait un bon serveur à partir de votre Raspberry.


1
Comme il l'a dit, la caméra Logitech fournit déjà le H.264. Le rPi ne transporte donc que des trames mais ne fait aucun encodage.
Matthias

Il ne transcode pas. Il suffit de rediffuser les données. Comme il utilise directement le flux.
Piotr Kula
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.