J'ai obtenu le Pi B + et la caméra Pi et j'essaie maintenant de trouver la configuration la plus efficace (faible processeur) et la latence la plus faible pour diffuser la vidéo encodée H.264 de la caméra vers mon serveur domestique.
J'ai lu ce qui suit:
(Tous les liens utilisent gstreamer-1.0 à partir de deb http://vontaene.de/raspbian-updates/ . main
.)
Beaucoup a été fait à cet égard au cours des dernières années.
À l'origine, nous devions canaliser la sortie de raspivid
dans gst-launch-1.0
(voir lien 1).
Puis (lien 2) le driver officiel V4L2 a été créé qui est maintenant standard, et il permet d'obtenir directement les données sans pipe, en utilisant juste gstreamer (voir notamment le post de towolf »sam. 07 déc. 2013 15h34 en lien 2):
Expéditeur (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
Destinataire: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Si je comprends bien, les deux façons utilisent le GPU pour faire le décodage H264, mais ce dernier est un peu plus efficace car il n'a pas besoin de passer par le noyau une autre fois car il n'y a pas de canal entre les processus impliqués.
Maintenant, j'ai quelques questions à ce sujet.
Ce dernier est-il toujours le moyen le plus récent d'obtenir efficacement le H264 de la caméra? J'ai lu
gst-omx
, ce qui permet aux pipelines gstreamer comme... video/x-raw ! omxh264enc ! ...
. Est-ce que cela fait quelque chose de différent que de simplement utiliservideo/x-h264
, ou pourrait-il même être plus efficace? Quelle est la différence?Comment savoir quel plugin de codage gstreamer est réellement utilisé lorsque j'utilise le
video/x-h264 ...
pipeline? Cela semble simplement spécifier le format que je veux, par rapport aux autres parties du pipeline, où je nomme explicitement le composant (code) (commeh264parse
oufpsdisplaysink
).Dans cette réponse au lien 1, Mikael Lepistö mentionne "J'ai supprimé une passe de filtre inutile du côté de la diffusion en continu" , ce qui signifie qu'il a supprimé le
gdppay
etgdpdepay
. Que font-ils? Pourquoi sont-ils nécessaires? Puis-je vraiment les retirer?Il mentionne également qu'en spécifiant des
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
paramètres pour leudpsrc
côté récepteur, il est capable de démarrer / reprendre le streaming au milieu du flux. Que permettent ces plafonds, pourquoi ces choix spécifiques, où puis-je en savoir plus à leur sujet?Quand je fais ce qui est suggéré aux questions 3 et 4 (ajout de
caps
, chutegdppay
etgdpdepay
) alors ma latence vidéo devient bien pire (et semble s'accumuler, la latence augmente avec le temps, et après quelques minutes la vidéo s'arrête)! Pourquoi est-ce possible? Je voudrais obtenir la latence que j'ai obtenue avec la commande d'origine, mais j'ai également la possibilité de pouvoir rejoindre le flux à tout moment.J'ai lu que RTSP + RTP utilise généralement une combinaison de TCP et UDP: TCP pour les messages de contrôle et d'autres choses qui ne doivent pas être perdus, et UDP pour la transmission de données vidéo réelle. Dans les configurations ci-dessus, est-ce que j'utilise réellement cela, ou est-ce que j'utilise seulement UDP uniquement? C'est un peu opaque pour moi que gstreamer s'en occupe ou non.
J'apprécierais toute réponse à une seule de ces questions!
|
crée un problème dans ce contexte est un morceau incroyable de BS Avez-vous essayé desraspivid | cvlc
méthodes? Je n'ai pas eu l'appareil photo depuis très longtemps ou beaucoup de temps pour jouer avec, mais l'utiliser pour produire un flux http (visible sur linux à l'autre extrémité avecvlc
) semble fonctionner correctement.cat file | grep ...
au lieu degrep ... file
. Le canal ajoute une autre couche de copie vers et depuis le noyau, qui est facilement mesurable, en particulier sur les périphériques à faible bande passante mémoire. Si gstreamer peut lire directement à partir du fichier du périphérique, pourquoi ne pas l'utiliser? Concernant votreraspivid | cvlc
suggestion: je l'utilisais avant de passer à la solution basée sur gstreamer, elle a jusqu'à 3 secondes de latence de plus que gstreamer (je ne sais pas pourquoi).cvlc
utilise ~ 45%, mais simplement courir dans un tuyau à ce débit de données (en gardant à l'esprit que le tuyau ne le ralentit pas ) déplacerait à peine l'aiguille, je pense. Comme <5%. Ce n'est pas totalement insignifiant si vous voulez le faire aussi efficacement que possible bien sûr ...raspivid | cvlc
là et c'est 40-50%. Les gens peuvent mieux répondre à une question qui les met au défi d'améliorer un chiffre spécifique. En ce moment, vous demandez beaucoup pourquoi, sans expliquer pourquoi chaque pourquoi est important.Réponses:
Les options:
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
Choses à considérer
top -d 10
)Comparaison:
la source
?
"?La seule façon moderne de diffuser H264 vers un navigateur est avec UV4L : pas de latence, pas de configuration, avec audio en option, audio / vidéo bidirectionnel en option. Pas de sauce GStreamer magique, mais il est possible d'étendre son utilisation.
la source
uv4l
? Mon pipeline gstreamer semble assez obsolète maintenant! J'ai hâte de tester la latence!1.) h264es en streaming sur le réseau (exemple uniquement)
sur le serveur:
sur le client:
2.) streaming mjpeg sur le réseau (exemple uniquement)
sur le serveur:
sur le client:
tout cela fonctionne même sur un RPi Zero W (configuré comme serveur)
la source
sample only
signifie?