2017-03-23 3 views
0

J'ai une webcam C920 logitec usb installé sur un xu4 odroid, avec linux ubuntu installé. Je veux enregistrer de la vidéo de la plus haute qualité au format h264.enregistrer gstreamer flux avec différentes résolutions en même temps

Donc 30 images par seconde et la taille de la vidéo 1920x1080. Tout en même temps envoyer un flux format h264 mais sur une qualité inférieure.

Je peux enregistrer et diffuser avec la même qualité mais pas avec une qualité différente. Est-ce que quelqu'un maintenant comment réparer le pipeline de telle sorte que je puisse diffuser à une qualité inférieure? travail (même résolution):


gst-launch-1.0 v4l2src device=/dev/video0 ! tee name=t \ 
! queue ! video/x-h264,framerate=30/1,width=1920,height=1080 ! h264parse ! mp4mux ! filesink location=/media/webcam.mp4 -v -e t. \ 
! queue ! h264parse ! rtph264pay ! udpsink host=113.141.0.1 port=4321

ne fonctionne pas: (envoi taille 800x600):

gst-launch-1.0 v4l2src device=/dev/video0 ! tee name=t \ 
! queue ! video/x-h264,framerate=30/1,width=1920,height=1080 ! h264parse ! mp4mux ! filesink location=/media/webcam.mp4 -v -e t. \ 
! queue ! video/x-h264,framerate=30/1,width=800,height=600 ! h264parse ! rtph264pay ! udpsink host=113.141.0.1 port=4321 

est l'erreur ici que je reçois en essayant différentes résolutions:



ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data flow error. 
Additional debug info: 
gstbasesrc.c(2865): gst_base_src_loop(): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: 
streaming task paused, reason not-negotiated (-4) 
/GstPipeline:pipeline0/GstMP4Mux:mp4mux0.GstPad:src: caps = video/quicktime, variant=(string)iso 
EOS on shutdown enabled -- waiting for EOS after Error 
Waiting for EOS... 
/GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = video/quicktime, variant=(string)iso 
ERROR: from element /GstPipeline:pipeline0/GstH264Parse:h264parse1: No valid frames found before end of stream 
Additional debug info: 
gstbaseparse.c(1153): gst_base_parse_sink_event_default(): /GstPipeline:pipeline0/GstH264Parse:h264parse1 
ERROR: from element /GstPipeline:pipeline0/GstH264Parse:h264parse0: No valid frames found before end of stream 
Additional debug info: 
gstbaseparse.c(1153): gst_base_parse_sink_event_default(): /GstPipeline:pipeline0/GstH264Parse:h264parse0 
+0

Avez-vous essayé l'élément 'videoscale'? – Velkan

Répondre

0

J'ai trouvé Une solution possible, mais c'est une opération très lourde (CPU sage) car nous devons d'abord décoder la vidéo H264 de la webcam, changer la résolution et l'encoder à nouveau.

En fonction du framerate, de l'image vidéo, de la vitesse d'encodage et du débit, cette opération peut prendre plusieurs cœurs sur l'odroid-xu4. Par rapport à ne pas changer la résolution du tout, où maximum 20% d'un noyau à la plus haute résolution et le framerate du réglage H264 sur la webcam (1920x1080 @ 30fps).


gst-launch-1.0 v4l2src device=/dev/video0 ! tee name=t ! queue ! video/x-h264,framerate=30/1,width=1920,height=1080 ! h264parse ! mp4mux ! filesink location=/root/temp/webcam.mp4 -v -e t. ! queue ! decodebin ! videoscale ! videorate ! video/x-raw,framerate=30/1,width=800,height=600 ! x264enc bitrate=500 speed-preset=superfast tune=zerolatency ! h264parse ! rtph264pay ! udpsink host=132.132.10.11 port=1234 -v 

Notez que si x264enc n'a pas le paramètre 'air = ZeroLatency du pipeline sera bloquée avec le message « Redistribuer temps d'attente ... »

Est-ce que quelqu'un connaît une commande similaire mais avec moins de CPU utilisation?

+0

Si votre système est équipé d'un codeur H.264, vous pouvez utiliser les plugins VAAPI ou OpenMAX pour l'encodage vidéo. Vous devrez faire des recherches ici. Sinon, vous devrez le faire dans un logiciel qui est - comme vous l'avez déjà remarqué assez cher. –