Добрый день. Имеется приложение на Qt, которому стримят на udp порт видео следующего формата:
General
Complete name : cam7.avi
Format : AVI
Format/Info : Audio Video Interleave
File size : 767 MiB
Duration : 12 min 0 s
Overall bit rate : 8 927 kb/s
Writing application : MEncoder Redxii-SVN-r37313-4.8.3
Writing library : MPlayer
Video
ID : 0
Format : JPEG
Codec ID : IJPG
Codec ID/Hint : Intergraph
Duration : 12 min 0 s
Bit rate : 8 922 kb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate : 25.000 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Compression mode : Lossy
Bits/(Pixel*Frame) : 0.387
Stream size : 766 MiB (100%)
Стоит задача отображать его в osgEarth. Начать я решил с получения очередного кадра посредством QAbstractVideoSurface, накидал небольшой тест: https://github.com/popov-aa/MJpegStream.git
Параметр запуска –input определяет источник воспроизведения: file - посредством установки setMedia «file://», stream - устанавливает конвейер gstreamer, содержащий udpsrc:
gst-pipeline: udpsrc port=20101 ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! xvimagesink name=qtvideosink
Параметр запуска –output определяет куда будет выводится видео: widget - в QVideoWidget, surface - в QLabel посредством QAbstractVideoSurface.
Результаты следующие (параметры запуска):
–input file –output widget Отображение в QVideoWidget корректное, дополнительных окон нет
–input file –output surface Отображение в Surface widget корректное, дополнительных окон нет
Это говорит о том, что с кодеками в системе все хорошо, MyVideoSurface корректно извлекает каждый кадр.
–input stream –output widget QVideoWidget - черный, отображение видео в другом окне
–input stream –output surface Surface widget - пустой, отображение видео в другом окне
А вот распознание потока уже хромает. Воспроизведение потока запускаю следующим способом:
gst-launch-1.0 -v filesrc location=cam7.avi ! avidemux ! rtpjpegpay ! udpsink host=127.0.0.1 port=20101
Оригинальное видео, на котором я тестирую, к сожалению не могу залить. Заменил его бажным сгенерированным куском, но поведение теста от этого не изменилось.
Подозреваю, что проблема в конвейере gstreamer, но пока не понял где. Однако при этом поток воспроизводится в отдельном окне, то есть все успешно декодируется. Прошу помощи у сообщества. Залитый на github тест самодостаточный, содержит примерное видео.