Команда GST (gstreamer) в команде QMediaPlayer

Я использую Qt Creator 4.5.2 (Qt 5.9.5, GCC 7.3.0 64-бит) и работаю на Ubuntu 18.04. Я просто пытаюсь получить поток видео в реальном времени с IP-камеры. Я использовал методы QGraphicsView, QGraphicsScene, QGraphicsVideoItem и QMediaPlayer.

Прямо сейчас источником потокового видео является IP-камера, и я использую «QMediaPlayer» с «RTSP» для получения видео в реальном времени, и он работает. Однако по соображениям производительности и другим причинам мне нужно перейти на команду типа gstreamer, например 'gst-launch-1.0', чтобы получить видео в реальном времени. Мне не удается найти правильную строку gst pipe. Нужна помощь.

В документе для QMediaPlayer говорится: Начиная с Qt 5.12.2, схема URL-адресов gst-pipeline предоставляет настраиваемые конвейеры для бэкэнда GStreamer. Моя версия 5.9.5, поэтому я думаю, что команда типа GStreamer должна работать.

Связанный код и комментарии:

   // Setup GraphicsScene
   mpView = ui->gvCam;
   mpView->setVisible(true);
   mpScene = new QGraphicsScene;
   mpView->setScene(mpScene);
   mpScene->setSceneRect(0, 0, mpView->width(), mpView->height());
   mpView->setSceneRect(QRectF());
   // Setup IP camera
   mpPlayer1 = new QMediaPlayer;
   mpVideoItem1 = new QGraphicsVideoItem;
   mpPlayer1->setVideoOutput(mpVideoItem1);

   //The following line works and I got the live stream.
   mpPlayer1->setMedia(QUrl("rtsp://20.0.2.118:8554/0"));

   //However, I need to use GST type command, like:
   //gst-launch-1.0 rtspsrc location=rtsp://20.0.2.118:8554/0 ! decodebin ! videoscale \
               ! 'video/x-raw, width=480, height=270, format=I420' \
               ! xvimagesink sync=false force-aspect-ratio=false;

   //The above GST command worked if I issued from the terminal and I got the live stream. 
//But, I don't know how to put it as a 'gst pipeline' string as a parameter for  'setMedia' call.

   mpScene->addItem(mpVideoItem1);
   QSizeF qf1(mpView->width(), mpView->height());
   mpVideoItem1->setSize(qf1);
   mpVideoItem1->setAspectRatioMode(Qt::IgnoreAspectRatio);
   mpPlayer1->play();


person Steven Cao    schedule 10.10.2019    source источник


Ответы (1)


Если ваша версия Qt до 5.12.2, тогда пользовательский конвейер не будет работать с QMediaPlayer, потому что вместо него используется playbin.

person Fryz    schedule 11.10.2019
comment
Спасибо за ответ. Я пытаюсь использовать playbin и заставил его работать, используя для этого QProcess и QMediaPlayer. Но я хочу сделать в моем коде такой же способ (QGraphicsVideoItem) и НЕ смог найти правильный gst-pipeline. Вот мой код: mpPlayer1- ›setMedia (QUrl (gst-launch-1.0 playbin uri = rtsp: //20.0.2.118: 8554/0)); Я получил это сообщение: GStreamer; Невозможно приостановить - - person Steven Cao; 11.10.2019
comment
Если я обновлюсь до версии 5.12.2 или более поздней и добавлю строку «gst-launch-1.0 ...» в «mpPlayer1-› setMedia (..) », она будет работать? - person Steven Cao; 11.10.2019
comment
Я просто попробовал строку gst, gst-launch-1.0 playbin uri = rtsp: //20.0.2.118: 8554/0, в терминале Linux, и это сработало. Но я не знаю, почему я не мог поместить внутрь QMediaPlayer. - person Steven Cao; 12.10.2019
comment
Вам вообще не нужен QProcess. Просто используйте QMediaPlayer в своем приложении, как описано здесь doc.qt.io/qt-5 /qmediaplayer.html#setMedia. Установите все плагины GStreamer (базовые, хорошие, плохие, уродливые, ..). Кроме того, если вы используете потоковую передачу RTSP, у вас может не быть TEARDOWN с rtspsrc с использованием GStreamer до версии 1.14, но в версии 1.16 это нормально. - person Fryz; 12.10.2019
comment
Обратите внимание, что для установки пользовательского конвейера с Qt 5.12.2 синтаксис player->setMedia(QUrl("gst-pipeline: videotestsrc ! autovideosink")); - person Fryz; 12.10.2019
comment
Я все еще использую Qt 5.9.5 и уже имею все плагины: Base, Good, Band и Ugly. У меня GStreamer v1.14, поэтому я попытался воспроизвести локальный файл, используя эту строку 'player- ›setMedia (QUrl (gst-pipeline: playbin uri = file: ///home/test1/Videos/tmp1.avi)); '. Но я все еще получаю это сообщение об ошибке: GStreamer; Невозможно поставить на паузу - gst-pipeline: playbin uri = file: ///home/test1/Videos/tmp1.avi. Не знаю почему. Любая идея? - person Steven Cao; 14.10.2019
comment
playbin - это не настраиваемый конвейер, а вспомогательный инструмент, который создает соответствующий конвейер в соответствии с вашим URL-адресом. Если вы укажете URL-адрес, QMediaPlayer вызовет playbin внутренне и пусть он сделает всю работу. Теперь, если вы хотите создать свой собственный конвейер, просто не используйте playbin. GStreamer также дает вам возможность указать некоторые части конвейера, используемые playbin, например, вы можете попросить playbin использовать определенный приемник видео. Посмотрите здесь для получения дополнительных сведений о GStreamer gstreamer.freedesktop.org/ документация / учебные пособия / - person Fryz; 21.10.2019