LINUX.ORG.RU

opencv+rtsp+h264=fail

 , , , ,


1

4

Всем привет!

Пытаюсь проиграть видео с IP-камеры, которая вещает по rtsp в h264-кодировке и при любом движении в кадре получается очень много артефактов, что совсем не разобрать содержимое видео. Пробовались версии:

ffmpeg 3.0 (дефолтная сборка в убунте), 3.2.3 (самосборная);

opencv 3.2.0 (самосбор с гитхаба)

QT 5.8.0/g++ 6.0 для компиляции исходников вывода видео.

Примечательно, что ffmpeg -rtsp_transport tcp и vlc адекватно отрабатывают, а VideoCapture - так, как будто бы по udp идет вещание (что и подтвердил iptraf). Проверил исходники opencv 3.2.0 - там флаг rtsp_transport выставляется, но где-то дальше по коду игнорируется.

Тащить за собой libvlc чисто из-за того, что в ней удобная обертка над libavformat для работы с rtsp уж совсем не хочется, при том, что сам ffmpeg не использует libvlc и все равно правильно работает.

К сожалению, в инете патчей к opencv не нашел и все советы сходились на использовании libvlc.

Ах да, открывается устройство вот так:

cv::VideoCapture* cap = new cv::VideoCapture( "rtsp://<IP:port>/PSIA/Streaming/channels/2?videoCodecType=H.264" )

Может, кто-то уже сталкивался с этим багом и в курсе, как его можно побороть?

★★

Последнее исправление: aido (всего исправлений: 1)

Пытаюсь проиграть видео с IP-камеры

зачем там ffmpeg, opencv ? Gstreamer тут однозначно тем более в Qt5 это штатный бэкенд для Linux в QtMultimedia.

anonymous
()
Ответ на: комментарий от anonymous

кадры проходят некоторую предобработку в opencv.

Ок, мб я че-то из gstreamer забыл подключить при сборке opencv, раз такие баги с udp/tcp идут? только вот что...

aido ★★
() автор топика
Последнее исправление: aido (всего исправлений: 1)
Ответ на: комментарий от aido

кадры проходят некоторую предобработку в opencv

некоторую - это какую ? в Gstreamer тоже можно обрабатывать, можно opencv подключать

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plu...

если нужен настраиваемый конвеер для Qt

https://gstreamer.freedesktop.org/modules/qt-gstreamer.html

anonymous
()
Ответ на: комментарий от aido

скрипт на пхп загружающий кадры в альбоме на фб с автонастройкой распознавания пользщвоатплей, не тролю если че );

anonymous
()

Плюсирую рекомендацию GStreamer. Решал как-то подобную задачу. Если потоки не большие, можешь чуть ли не через stdin/stdout использовать при помощи fd_sink. Запустил из своей проги как процесс (QProcess и т.д.) цепочку GStreamer => всё работает и ты снова радуешься.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Я пока нашел вот такое. Там тоже gstreamer, но уже под оберткой opencv. Сегодня буду пробовать.

Потоки там вполне себе серьезные.

aido ★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

После всех мытарств в том руководстве вышло следующее:

(ERROR)icvOpenAVI_XINE(): Unable to initialize video driver.
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
GStreamer Plugin: Embedded video playback halted; module vaapidecode reported: Не удалось инициализировать дополнительную библиотеку.
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: va_openDriver() returns -1
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline
) in cvCaptureFromCAM_GStreamer, file /home/igor/viewer/opencv/modules/videoio/src/cap_gstreamer.cpp, line 832
VIDEOIO(cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename)): raised OpenCV exception:

/home/igor/viewer/opencv/modules/videoio/src/cap_gstreamer.cpp:832: error: (-2) GStreamer: unable to start pipeline
 in function cvCaptureFromCAM_GStreamer

Исключение в операции с плавающей точкой (сделан дамп памяти)

При установке i965_drv_video.so:

(ERROR)icvOpenAVI_XINE(): Unable to initialize video driver.
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0

aido ★★
() автор топика
Последнее исправление: aido (всего исправлений: 1)
Ответ на: комментарий от aido

Используешь VAAPI? А ты можешь показать свою пипелину? Я бы ее ограничил до минимально возможной чисто чтоб проверить что работает а что нет. Попробуй без ваапы, программный декод, для начала.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Без VAAPI:

Unable to stop the stream: Неприменимый к данному устройству ioctl

(project:20247): GStreamer-CRITICAL **: gst_element_link_pads_full: assertion 'GST_IS_ELEMENT (src)' failed
OpenCV Error: Unspecified error (GStreamer: cannot link color -> sink
) in cvCaptureFromCAM_GStreamer, file /home/igor/viewer/opencv/modules/videoio/src/cap_gstreamer.cpp, line 792
VIDEOIO(cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename)): raised OpenCV exception:

/home/igor/viewer/opencv/modules/videoio/src/cap_gstreamer.cpp:792: error: (-2) GStreamer: cannot link color -> sink
 in function cvCaptureFromCAM_GStreamer

тут еще такое дело, что хочется теми же средствами проигрывать обычные файлы, не только стримы. Если я собираю opencv без поддержки ffmpeg (только gstreamer), то такая возможность пропадает.

aido ★★
() автор топика
Ответ на: комментарий от aido

Почему у тебя это OpenCV всё время валится? Попробуй исключить его всеми способами. Я то работал без OCV и проблем не знал. Прямо в консоли можно пипелину свою опробовать.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

А какие есть варианты единообразного интерфейса доступа к видеофайлам и rtsp-потокам на C++? Gstreamer не смог открыть файл. А opencv с пинками открывает поток. Осталось сделать так, чтобы всегда открывалось.

aido ★★
() автор топика
Ответ на: комментарий от aido

Ок, понял, но всё же надеюсь отдельная работа приема и отображения потока с камеры была проверена отдельно. (я решал задачу ПО для специализированного видео-регистратора и принимал как раз RTSP поток)

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

У меня opencv'шный ffmpeg вообще кадры из видео пропускает (правда, это было в винде).

Waterlaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.