LINUX.ORG.RU

Сообщения Blastbit

 

Qml. Обращение к свойству родительского элемента при переопределении свойства.

Представим что есть подобный код:

//! SomeItem.qml
Rectangle {
    id: root
    property alias color: internal.color

    Rectangle {
        id: internal
        anchors.centerIn: parent
        width: parent.width/2
        height: parent.height/2
    }
}

При обращении из вне к объекту SomeItem.color будет выставлено свойство внутреннего ректенгла. То же самое и изнутри при указании свойства color хоть с указанием id, хоть без.

Так вот, как мне обратиться к свойству редительского объекта Rectangle? В С++ при наследовании достаточно было бы сделать что-то вроде Rectangle::color. Не спрашивайте зачем и не предлагайте поменять названия свойств, это и так ясно. Интересует именно такой вариант, возможно ли это?

 , ,

Blastbit
()

GStreamer RTMP стрим, ошибка и снижение fps

К примеру, принимаю стрим подобной строкой:

gst-launch rtmpsrc location=адрес ! decodebin2 max-size-time=1 ! xvimagesink

Стрим принимается, всё чудесно, видео идет

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock

И тут к примеру стрим тормозит, или какое-то время данные не идут, потом стрим возобновляется, данные начинают идти и тут фпс отображения становится примерно равным 1, и в лог сыпется данное сообщение каждую секунду(в момент обновления фрейма):

WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: A lot of buffers are being dropped.
Additional debug info:
gstbasesink.c(2875): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
There may be a timestamping problem, or this computer is too slow.

Как видно из тела сообщения(последяя строка), что либо у вас медленный комп, либо проблема в таймстэпм. Компьютер не слоу, отметаем, видимо проблема в временных метках. Если подрубиться к трансляции заново, то всё идет нормально. Пробовал ставить свойство do-timestamp=true, чтоб вроде как метки ставились, но эффекта это не дает. Наверное можно поставить буфферизацию, тогда какие-то перебои в передаче данных оно перекроет, но это не катит, т.к. надо лайв видео.

Вообщем кто-то сталкивался с такой проблемой? Есть пути решения?

 

Blastbit
()

GStreamer RTMP и снижение FPS после разрыва стриминга

Суть такова: запускаю я к примеру воспроизведение трансляции такой строкой:

gst-launch rtmpsrc location=rtmp://... ! decodebin2 ! xvimagesink

Стрим может прерываться (точнее поток видеоданных). Видео при старте идет нормально, с нормальным фпс 15. Прерываю поток данных(без закрытия стрима), восстанавливаю, и видео снова начинает отображаться, но с фпс близким к 1, в логах видно, что буффер 15 раз в секунду приходит. Пробовал и с отключеным буфером и с включеным - результат один. VLC, например, работает нормально, фпс не падает.

Есть подозрения, что rtmp плагин кривой и проблема в нем. Но может быть кто-то сталкивался с такой проблемой и может просветить? Может быть какими-то параметрами запуска можно изменить положение дел?

 ,

Blastbit
()

Gstreamer, получение видео по-кадрово, преобразование в Qt/GL формат изображения

Продолжение темы Qt Phonon video player в отдельном потоке.

Отошел от фонона.

Есть GStreamer (ну и бинд к Qt). Нужно принимать видеопоток в rtmp, декодировать(ну и прочее), и после этого брать изображение в виде картинки(ну чтоб в QImage к примеру можно было в итоге запихнуть, или ещё в какой контейнер) для последующей передачи любым способом(ну вообще предполагается сигнал) и отрисовки где угодно. QGst::ui::widget или прочее не нужно, надо чтоб декодирование и отправка кадров проиходила в отдельном потоке, чтоб это дело не вешало гуи поток.

Внимание вопрос, как это можно сделать? Какие элементы гстримера использовать и как это всё далее преобразовать?

В примере плеера создание пайплайна происходит примерно так, и это работает нормально, потом передается url и всё показывает.

Я полагаю что нужно как-то вытащить кадры или как-то приконнектить пайплайн к обработчику, ну а дальше уже понятнее.

ниже вырезка из примера создания пайплайна, чтоб не было так постно:

//.. это всё в классе наследнике QGst::Ui::VideoWidget

m_pipeline = QGst::ElementFactory::make("playbin2").dynamicCast<QGst::Pipeline>();
        if (m_pipeline) {
            //let the video widget watch the pipeline for new video sinks
            watchPipeline(m_pipeline); //тут виджет биндится к пайплайну

            //watch the bus for messages
            QGst::BusPtr bus = m_pipeline->bus();
            bus->addSignalWatch();
            QGlib::connect(bus, "message", this, &Player::onBusMessage);

 ,

Blastbit
()

Qt Phonon video player в отдельном потоке.

Есть приложение, выводящее несколько видео на одном экарне, по сути используется фононовский плеер, в несколько фреймов(ну несколько в ряд, скажем). Каждый фрейм - отдельный объект фононоского плеера. Видео принимается по сети в rtmp, и по этому случаются подвисания при переключении видео источника(ну ссылка там меняется когда например). Всё это дело крутится в одном главном потоке с GUI. Логично было бы убрать их в отдельные потоки, но тут сразу ограниение Qt, все виджеты должны быть в главном потоке.

Посмотрел поподробнее Phonon, а точнее на Phonon::MediaObject и Phonon::VideoWidget, подумал что неплохо бы вынести Phonon::MediaObject в поток, вынес. Видео виджет тем временем живет в основном потоке. Далее связываем видеовиджет с медиаобджек с помощью Phonon::createPath. Всё компилится, но при запуске в логи сыпятся ошибки данного содержания :

QObject: Cannot create children for a parent that is in a different thread.
(Parent is Phonon::MediaObject(0xab5004c8), parent's thread is QThread(0x9c505f0), current thread is QThread(0x921d250)

и вместо видео на виджет выводится белая картинка, хоть и с нужными размерами. Вопрос: кто-то занимался подобным, пробовал вынести объект источника в отдельный поток? Может есть другие варианты?

 , ,

Blastbit
()

Настройка среды кросс-компиляции под arm на Ubuntu, GStreamer, Qt

Есть одноплатный комп Beagleboard xM с процом AM37x 1GHz ARM Cortex-A8 compatible, с убунтой. Под него нужно собрать rtsp сервер основанный на GStreamer gst-rtsp-server (0.10 или 1.0 без разницы). Нужно настроить среду сборки для кросскомпиляции на Ubuntu x86, желательно чтоб прикрутить к QtCreator, т.к. вообще предусматривается ещё и Qt приложения.

Вобщем то Qt из Embedded собрать удалось, даже запустить хелоуворлд без гуи. А вот с GStreamer так и не доковырял. Что бы собрать полностью из исходников гстример надо ещё и другие либы под арм, использованные им.

Если кто-то собирал gstreamer под arm - поделитесь опытом, может быть есть какие-то паки сразу скомпиленые под эту архитектуру. Я пробовал некоторые SDK, в том числе и от Texas Instrument, только так и не удалось прикрутить их нормально.

 , , ,

Blastbit
()

GStreamer 1.0, gst-rtsp-server, стриминг вебкамеры в RTSP, дубль 2

Суть такова. Собрал из гит репов последний GStreamer(1.0.9), а так же все плагины (base, good, bad, ugly, libav) и rtsp-server. Установил (make install). Модифицировал один из примеров(gst-rtsp-server/examples) простейшего сервера на стриминг с вебки - поменял строчку gst_rtsp_media_factory_set_launch()... на найденную в на одном из форумов:

gst_rtsp_media_factory_set_launch (factory,
                                     "( "
                                     "uvch264src device=/dev/video0 name=src auto-start=true iframe-period=1000 src.vidsrc ! queue ! video/x-h264,width-1920,height=1080,framerate=30/1 ! h264parse ! rtph264pay pt=96 name=pay0 src.vfsrc ! queue ! video/x-raw,width=432,height=240,framerate=30/1 ! xvimagesink "
                                     ")");

Всё скомпилилось, запустилось, но при попытке подключиться к вещанию в логи сыпятся ошибки и подключения не происходит:

0:00:02.334165091   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00;01;37;41m        GST_PIPELINE ./grammar.y:672:priv_gst_parse_yyparse:  [00m no element "uvch264src"
0:00:02.334239918   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00;01;37;41m        GST_PIPELINE ./grammar.y:942:priv_gst_parse_launch:  [00m Unrecoverable syntax error while parsing pipeline ( uvch264src device=/dev/video0 name=src auto-start=true iframe-period=1000 src.vidsrc ! queue ! video/x-h264,width-1920,height=1080,framerate=30/1 ! h264parse ! rtph264pay pt=96 name=pay0 src.vfsrc ! queue ! video/x-raw,width=432,height=240,framerate=30/1 ! xvimagesink )

** (gstrtspserver-test1_0:6880): CRITICAL **: could not parse launch syntax (( uvch264src device=/dev/video0 name=src auto-start=true iframe-period=1000 src.vidsrc ! queue ! video/x-h264,width-1920,height=1080,framerate=30/1 ! h264parse ! rtph264pay pt=96 name=pay0 src.vfsrc ! queue ! video/x-raw,width=432,height=240,framerate=30/1 ! xvimagesink )): no element "uvch264src"

** (gstrtspserver-test1_0:6880): CRITICAL **: could not create element
0:00:02.334412208   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00m          rtspclient rtsp-client.c:584:find_media:  [00m client 0x94eec18: can't create media
0:00:02.334508028   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00m          rtspclient rtsp-client.c:1724:handle_describe_request:  [00m client 0x94eec18: no media

(gstrtspserver-test1_0:6880): GLib-CRITICAL **: unblock_source: assertion `!SOURCE_DESTROYED (source)' failed

(gstrtspserver-test1_0:6880): GLib-CRITICAL **: unblock_source: assertion `!SOURCE_DESTROYED (source)' failed

До этого использовал GStreamer 0.10, там стримилось с такой строкой:

    gst_rtsp_media_factory_set_launch (factory,
                                       "( "
                                       "v4l2src device=/dev/video0 "
                                       "! video/x-raw-yuv,width=352,height=288,framerate=30/1 "
                                       "! ffmpegcolorspace "
                                       "! videoscale "
                                       "! ffenc_mpeg4 tune=zerolatency byte-stream=true threads=2 speed-preset=3 "
                                       "! ffenc_mpeg4 tune=zerolatency byte-stream=true bitrate=1050 threads=0 speed-preset=3"
                                       "! v4l2sink "
                                       "! rtpmp4vpay pt=96 name=pay0 "
                                       ")");

но тут совсем не хочет работать, ругается почти на каждый элемент, даже при замене на логически похожие (например ffmpegcolorspace заменял на autoconvert).

Так кто-нибудь может быть знает как это дело завести? Может какие мысли есть? Как понимаю no element «uvch264src» означает что элемент не найден, но как это исправить не знаю.

Сразу оговорюсь, vlc и ffmpeg(ffserver/avserver) пробовал, не впечатлило, не подходит вобщем. Нужно именно решение с GStreamer 1.0+

 , ,

Blastbit
()

GStreamer 1.0, сборка и дальнейшее использование (rtsp-server)

Доброго времени суток. Собрал GStreamer 1.0+ из сорцов(вытянул с гита) с оф сайта, кое как поставил. Собрал gst-rtsp-server с помощью вспомогательных скриптов, собрались и примеры. Но как только попробовал собрать свой пример (ну проект в QtCreator набран, т.к. дальше это дело с кутэ будет использовано), так сразу посыпались ошибки. На сколько понимаю ругается на либу gio, но разобраться не могу.

Вот собственно содержимое pro файла:

#-------------------------------------------------
#
# Project created by QtCreator 2013-08-15T11:47:42
#
#-------------------------------------------------
QT       += core
QT       -= gui
TARGET = gstrtspserver-test1_0
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app
SOURCES += main.cpp
PKGCONFIG += gstreamer-1.0
INCLUDEPATH += /usr/local/include/gstreamer-1.0 \
        /usr/include/glib-2.0 \
        /usr/lib/i386-linux-gnu/glib-2.0/include \

LIBS += /usr/local/lib -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgio-2.0 \

Код содержит только подключение библиотек и main.

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>

ну вот и собственно сама ошибка:

In file included from /usr/include/glib-2.0/gio/gio.h:54:0,
                 from /usr/local/include/gstreamer-1.0/gst/net/gstnetaddressmeta.h:24,
                 from /usr/local/include/gstreamer-1.0/gst/net/gstnet.h:24,
                 from /usr/local/include/gstreamer-1.0/gst/rtsp-server/rtsp-media.h:23,
                 from /usr/local/include/gstreamer-1.0/gst/rtsp-server/rtsp-session.h:57,
                 from /usr/local/include/gstreamer-1.0/gst/rtsp-server/rtsp-session-pool.h:31,
                 from /usr/local/include/gstreamer-1.0/gst/rtsp-server/rtsp-server.h:31,
                 from ../gstrtspserver-test1_0/main.cpp:3:
/usr/include/glib-2.0/gio/gdbusintrospection.h:157:25: error: expected unqualified-id before 'protected'
/usr/include/glib-2.0/gio/gdbusintrospection.h:157:24: error: expected ';' at end of member declaration
/usr/include/glib-2.0/gio/gdbusintrospection.h:157:32: error: expected ':' before ';' token
make: *** [main.o] Error 1

Вроде бы всё так подключено, либы там вроде бы есть, хедеры тоже. Что странно - примеры собрались при сборке сорцов сервера, а своё уже нет. Посмотрел мэйкфайл тестовых примеров, подключение либ вроде такое же, там конечно есть и дополнительные флаги, но я незнаю могут ли они влиять и как их впихнуть в про файл.

Пробовал тоже самое на Gstreamer 0.10, всё работало, покопался в исходниках и обнаружил, что в новой сервере (с версии 1.0) подключена библиотека <gio>.

 , ,

Blastbit
()

ffmpeg ffserver(avserver) стриминг видео в rtsp

Имеется kubuntu 12.10 Пытаюсь стримить видео с вебкамеры в флеш и RTSP. Конфиги взяты с хабра и подправлены (http://habrahabr.ru/post/78677/): ==============================================================

Port 8099

RTSPPort 5454

BindAddress 0.0.0.0

MaxClients 100

MaxBandwidth 20000

NoDaemon

# Фид, надо запомнить feed.ffm, он нам потребуется при запуске

ffmpeg

<Feed feed.ffm>

File /tmp/feed.ffm

FileMaxSize 3M

Launch avconv -s 352x288 -r 20 -f video4linux2 -i /dev/video0 -pix_fmt yuv420p

</Feed>

<Stream test.flv>

# Ранее объявленный фид

Feed feed.ffm

Format flv

VideoCodec mjpeg

VideoFrameRate 25

VideoBufferSize 80000

VideoBitRate 200

# Качество видео от 1 до 31, 1 == отлично 31 == фи!

VideoQMin 1

VideoQMax 5

# Разрешение, везде должно быть одинаково!

VideoSize 640x480

PreRoll 1

Noaudio

</Stream>

# Флешка test.swf для просмотра трансляции

<Stream test.swf>

Feed feed.ffm

# Будет запускаться в Adobe Flash Player

Format swf

VideoCodec mjpeg

VideoFrameRate 25

VideoBufferSize 50000

VideoBitRate 100

VideoQMin 1

VideoQMax 5

VideoSize 640x480

PreRoll 0

Noaudio

</Stream>

# RTSP

<Stream test.rtsp>

Feed feed.ffm

Format rtp

VideoCodec libx264

VideoFrameRate 20

VideoBufferSize 2000

VideoBitRate 800

VideoQMin 1

VideoQMax 31

# Разрешение, везде должно быть одинаково!

VideoSize 640x480

Noaudio

</Stream> ============================================================

Долго мучился с параметрами, домучился до того, что в фиде запускается камера(видно по индикации светодиода). Но при попытке подключения любым из плееров(vlc, gst-launch, avplay) идет ожидание и видео нет(но ошибок не показывает). При заходе на страницу http://localhost:8090/test.swf только загрузка, ничего нет.

так собственно кто-нибудь может помочь разобраться в чем проблема?

А задача вобщем то в том, что бы стримить видео с вебкамеры(или другой usb) в rtsp потоке. Что только не пробовал.

VLC Стримит, но есть задержка в секунды 2, изменение разних параметров не помогло, вот строка которой запускаю, если вдруг тут есть варианты:

cvlc v4l2:///dev/video0:v4l2-fps=25:v4l2-caching=1 --sout '#transcode{vcodec=h264,venc=x264{tune=zerolatency,preset=ultrafast},vb=300,scale=1,width=320,height=200,fps=25,noaudio}:rtp{url=192.168.1.13,port=7777,sdp=rtsp://192.168.1.13:7777/stream}' --rtsp-host=192.168.1.13-caching=1 --dshow-caching=0 -I dummy

GStreamer тоже пробовал, собирал тестовый пример ихнего gst-rtsp-server, но там какието проблемы с rtsp_media_factory, я ставил такие параметры: gst_rtsp_media_factory_set_launch (factory, "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"); да и не только такие, много что перепробовал, всё время выдает ошибки при запросе на подобии этой(чаще всего это):

(GstRtspServer_test:10077): GLib-GObject-CRITICAL **: g_object_ref: assertion `G_IS_OBJECT (object)' failed

** (GstRtspServer_test:10077): CRITICAL **: gst_rtsp_media_factory_get_auth: assertion `GST_IS_RTSP_MEDIA_FACTORY (factory)' failed

Также смотрел на livemedia, но гугление на данную тему не особо что показал(если есть нормальные примеры как это дело можно провернуть, то буду признателен).

Вобщем бьюсь не первые сутки, если есть мысли, поделитесь пожалуйста.

P.S./извиняюсь за объемный пост

UPD: по ffmpeg Если запустить feed отдельным процессом (вместо Launch ...) строкой avconv -s 640x480 -r 20 -f video4linux2 -i /dev/video0 -pix_fmt yuv420p -f h264 http://localhost:8090/feed.ffm

то в логах вот что выдает:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:00:59 with gcc 4.6.3 [video4linux2 @ 0x8c783e0] The driver changed the time per frame from 1/20 to 1/30 [video4linux2 @ 0x8c783e0] Estimating duration from bitrate, this may be inaccurate Input #0, video4linux2, from '/dev/video0': Duration: N/A, start: 482284.519933, bitrate: 147456 kb/s Stream #0.0: Video: rawvideo, yuyv422, 640x480, 147456 kb/s, 30 tbr, 1000k tbn, 30 tbc [buffer @ 0x8c7c4c0] w:640 h:480 pixfmt:yuyv422 [avsink @ 0x8c7a420] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out' [scale @ 0x8c73a40] w:640 h:480 fmt:yuyv422 -> w:640 h:480 fmt:yuv420p flags:0x4 [libx264 @ 0x8c79660] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2 AVX [libx264 @ 0x8c79660] profile Main, level 3.0 Output #0, h264, to 'http://localhost:8090/feed.ffm': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: libx264, yuv420p, 640x480, q=-1--1, 90k tbn, 30 tbc Stream mapping: Stream #0:0 -> #0:0 (rawvideo -> libx264) Press ctrl-c to stop encoding non-strictly-monotonic PTS size= 86kB time=1.90 bitrate= 369.7kbits/s its/s [libx264 @ 0x8c79660] non-strictly-monotonic PTS Last message repeated 1 times

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 333000 >= 333000 [h264 @ 0x8c78f60] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 342000 >= 342000

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 351000 >= 351000 non-strictly-monotonic PTS size= 277kB time=5.93 bitrate= 382.0kbits/s [libx264 @ 0x8c79660] non-strictly-monotonic PTS Last message repeated 1 times

И так далее.

Если убрать -f h264 и запускать так:

avconv -s 640x480 -r 20 -f video4linux2 -i /dev/video0 -pix_fmt yuv420p http://localhost:8090/feed.ffm

то логи не выдают предупреждений, но видео все равно нет, но запуск через avplay командой avplay rtsp://localhost:5454/test.rtsp выдает вот что

avplay version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2003-2013 the Libav developers built on Apr 2 2013 17:00:59 with gcc 4.6.3 [rtsp @ 0xafd00480] UDP timeout, retrying with TCP

тут виснет и после остановки выдает:

^C[rtsp @ 0xafd00480] Could not find codec parameters (Video: h264) [rtsp @ 0xafd00480] Estimating duration from bitrate, this may be inaccurate rtsp://localhost:5454/test.rtsp: could not find codec parameters

 , , , ,

Blastbit
()

RSS подписка на новые темы