Gstreamer не опускается на именованную трубу
Я получаю другое поведение, когда приемник конвейера gst-запуска является именованным каналом по сравнению с обычным файлом.
У меня есть конвейер gst-launch, который отображает видео с камеры на встроенной (linux) плате OMAP и доставляет видео в формате avi через тройник.
gst-launch -v -e omx_camera device=0 do-timestamp=1 mode=0 name=cam cam.src ! "video/x-raw-yuv, format=(fourcc)NV12, width=240, height=320, framerate=30/1" ! tee name=t1 t1. ! queue ! ducatih264enc profile=100 level=50 rate-preset=low-delay bitrate=24000 ! h264parse ! queue ! avimux ! filesink location=/tmp/camerapipe t1. ! queue ! dri2videosink sync=false
Если я сделаю
filesink location=/some/real/file t1.
все хорошо
но я хочу прочитать вывод с помощью процесса Java/opencv, и когда я делаю это, я ничего не получаю в процессе Java. Процесс gst-launch объявляет, что он изменен на PLAY.
Чтобы упростить вещи вместо процесса Java, я tail -f
именованная труба
и также не вижу никакого вывода, хотя в обоих случаях dri2videosink отображает видео
При использовании хвоста или java-процесса его уничтожение также останавливает процесс gst-launch, поэтому, очевидно, он в некотором смысле "связан".
Если убить процесс gst-launch с запущенным хвостом, то после выхода gst-launch получается что-то вроде нескольких K, может быть, 1 кадр данных.
Я попытался сохранить в обычный файл и прочитать с помощью процесса Java, который работает, поэтому я знаю, что это не формат данных.
2 ответа
Я пытаюсь сделать то же самое, я использую OpenCV в C и работает в Ubuntu, хотя.
Я получил следующее, чтобы работать:
Я создал именованный канал в / dev / named video_stream, используя mkfifo, чтобы у вас были права на чтение / запись в него или просто на использование sudo.
Воспроизвести с тестовым видео на именованный канал
sudo gst-launch -e videotestsrc ! video/x-raw-yuv, framerate=20/1, width=640, height=480 ! ffenc_mpeg4 ! filesink location=/dev/video_stream
Воспроизвести с веб-камеры на именованный канал:
sudo gst-launch -e v4l2src device=/dev/video0 ! ffenc_mpeg4 ! filesink location=/dev/video_stream
Затем я использовал учебник по распознаванию лиц на
http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html
чтобы проверить все, но изменил свой ввод с веб-камеры 1 на namedpipe.
capture = cvCaptureFromCAM( -1 );
становится
VideoCapture capture("/dev/video_stream");
Это сработает, но проблема с каналами и файлами заключается в том, что при закрытии программы чтения gstreamer перестает работать. Решение состоит в том, чтобы использовать от user693131 : программу ftee
sudo gst-launch -e videotestsrc ! video/x-raw-yuv, framerate=20/1, width=640, height=480 ! ffenc_mpeg4 ! fdsink fd=1 | ./ftee /dev/video_stream > /dev/null 2>&1
Это выведет стандартный ввод в именованный канал с копией в стандартный вывод (отправленный в /dev/null), ноftee
проигнорированные ошибки и закрытие канала назначения. На воспроизведение с трубы и остановку gstreamer не влияет. Просто попробуй, а потом подумай над тем, что я написал. Не наоборот :)
Воспроизведение из именованного канала в любое время:
gst-launch filesrc location=/dev/video_stream ! autovideosink
Что касается вашего использования с OpenCV:
VideoCapture capture("/dev/video_stream");
видеопоток из/dev/video_stream
должен быть mpeg4, но я не уверен, правильно ли OpenCV определит источник. Возможно, вам придется поэкспериментировать с провайдером (даже провайдер gstreamer доступен при компиляции в opencv). См. предпочтения API при создании Capture:
VideoCapture (const String &filename, int apiPreference)
наборapiPreference
до надлежащего значения. Я бы попробовал ffmpeg или gstreamer. Если вы хотите использовать gstreamer напрямую, попробуйтеappsink
как раковина, то есть OpenCV. Это может быть что-то вроде
filesrc location=/dev/video_stream ! video/h264 ! appsink
кепки сvideo/h264
это слепое предположение, так как у меня нет кодировщика ffenc_mpeg4, потому что он из gst 0.10, но вы поняли идею.
Удачи.