GStreamer




GStreamer


mxa отредактировал эту страницу 29 мая · 1 редакцияНесколько простых примеров GStreamer (при условии, что v4l2loopback-device есть /dev/video1).

Потребитель


$ gst-launch-1.0 v4l2src device=/dev/video1 ! xvimagesink

Режиссер



videotestsrc


gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video1
Различные шаблоны videotestsrc с разным разрешением:
gst-launch-1.0 -v videotestsrc pattern=snow ! "video/x-raw,width=640,height=480,framerate=15/1,format=YUY2" ! v4l2sink device=/dev/video1
gst-launch-1.0 -v videotestsrc pattern=ball ! "video/x-raw,width=800,height=600,framerate=30/1,format=YUY2" ! v4l2sink device=/dev/video1
gst-launch-1.0 -v videotestsrc pattern=smpte horizontal-speed=1 ! "video/x-raw,width=1280,height=720,framerate=30/1,format=YUY2" ! v4l2sink device=/dev/video1

Захват рабочего стола как производитель


gst-launch-1.0 -v ximagesrc startx=1 starty=1 endx=320 endy=240 ! videoconvert ! "video/x-raw,format=YUY2" ! v4l2sink device=/dev/video1

Видео файл как продюсер


gst-launch-1.0 -v filesrc location=test.avi ! avidemux ! decodebin ! videoconvert ! "video/x-raw,format=YUY2" ! v4l2sink device=/dev/video1
Этот производитель не бесконечен: когда файл заканчивается, производитель останавливается.

Отдельные рамки PNG как бесконечный производитель


Создавайте фреймы, разделяя входной AVI на несколько PNG-файлов.
mkdir test
gst-launch-1.0 -v filesrc location=test.avi ! avidemux ! decodebin ! videoconvert ! pngenc snapshot=false ! multifilesink location=test/%05d.png
Используйте кадры как бесконечный производитель:
gst-launch-1.0 -v multifilesrc location=test/%05d.png loop=1 caps="image/png,framerate=30/1" ! pngdec ! videoconvert ! "video/x-raw,format=YUY2" ! v4l2sink device=/dev/video1
При отправке кадров в v4l2sink частота кадров может отличаться от частоты кадров исходного видеофайла. Его можно установить произвольно (60, 30, 15, 10, 5 или любое другое). Это позволяет создавать разные частоты кадров с одним и тем же набором кадров.
Декодирование PNG может потреблять много процессорного времени. Чтобы снизить нагрузку на процессор, используйте необработанные кадры YUV (см. Следующий пример).

Отдельные кадры YUV как бесконечный производитель


Создавайте кадры, разделяя видео. При потреблении рамок мы должны знать их размер. Поэтому, чтобы этот пример работал, видеофайл test.avi масштабируется до 640x480@30. В реальной жизни вы, вероятно, захотите использовать исходное измерение, а не масштаб.
mkdir test
gst-launch-1.0 -v filesrc location=test.avi ! avidemux ! decodebin ! videoconvert ! videoscale ! videorate ! "video/x-raw,width=640,height=480,framerate=30/1,format=YUY2" ! multifilesink location=test/%05d.yuv
Используйте кадры как бесконечный производитель:
gst-launch-1.0 -v multifilesrc location=test/%05d.yuv loop=1 caps="video/x-raw,width=640,height=480,framerate=30/1,format=YUY2" ! videoconvert ! v4l2sink device=/dev/video1
При создании кадров в v4l2sink частота кадров может отличаться от частоты кадров исходного видеофайла. Его можно установить произвольно (60, 30, 15, 10, 5 или любое другое). Это позволяет создавать разные частоты кадров с одним и тем же набором кадров.
Декодирование кадров YUV не требует много процессорного времени. Но кадры YUV занимают много места на диске и памяти.

НОТА


Этот последний пример (необработанные кадры YUV) еще не работает с Gstreamer-1.0 ...

«Внутренняя ошибка потока данных. / Причина не согласована (-4)»


Если вы получаете знаменитую ошибку внутреннего потока данных при использовании GStreamer в качестве производителя, вы можете добавить teeэлемент (чтобы обойти ошибку в текущем цикле v4l2loopback (на момент написания 0.10.0):
gst-launch-1.0 -v videotestsrc ! tee ! v4l2sink device=/dev/video1
С еще более новым GStreamer (> = 1.14) это должно больше не работать, и вы можете попробовать это вместо этого:
gst-launch-1.0 -v videotestsrc ! identity drop-allocation=1 ! v4l2sink device=/dev/video1

Содержание