Воспроизвести видео поток RTP, используя Qt? - PullRequest
8 голосов
/ 05 декабря 2009

Я хочу создать виджет Qt, который может воспроизводить входящие потоки RTP, где видео кодируется как H264 и не содержит аудио.

Мой основной план реализации таков:

  • Создание объекта Phonon MediaSource (тип потока).
  • Подключите его к подклассу QIODevice , который предоставляет данные
  • Получить видеоданные, используя либо:
    • Клиентская библиотека JRTPLIB
    • Плагин GStreamer gstrtpbin . Этот плагин заботится о том, чтобы выгружать пакеты и декодировать видео. Возможно, это повышает вероятность того, что Phonon распознает данные.

Мое окружение:

  • Ubuntu 9.10
  • Qt 4.6

Мои вопросы:

  • Мой подход хорош? Возможно, я пропускаю более очевидное или простое решение?
  • В настоящее время я испытываю эту проблему: при попытке воспроизведения видеопотока состояние MediaObject превращается в ErrorState с errorType FatalError. Может кто-нибудь сказать мне, что я делаю не так?

Редактировать
Одно решение, которое я нашел, - это использование libVLC в сочетании с Qt, о котором я узнал в этой ветке . Вот пример кода для заинтересованных. Я все еще ищу решение на базе Phonon.
В идеале мне нужно было бы предоставить только файл SDP, и работа выполнена.

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Мне удалось заставить его работать, используя решение libVLC. Я не могу гарантировать, что это лучшее решение, хотя я просто перестал следить за этим.

Вот ссылка на образец libVLC .

2 голосов
/ 07 декабря 2009

Я понимаю, что Phonon работает, по крайней мере, в Windows, так как QT предоставляет фононный плагин для DirectShow (\ plugins \ phonon_backend \ phonon_ds94.dll) и GStreamer в вашем случае. Затем вы либо получите, либо напишите свой собственный фильтр DirectShow, который может принимать потоки RTP в качестве источника. DirectShow позаботится о декодировании, а Phonon позаботится о рендеринге.

Так что, если бэкэнд работает, код приложения так же прост:

        Phonon::MediaObject *media = new Phonon::MediaObject();
        Phonon::VideoWidget *video = new Phonon::VideoWidget();
        Phonon::createPath(media, video);
        media->setCurrentSource(source);
        media->play();

Кажется, что проблема заключается в том, что бэкэнд GStreamer принимает RTP в качестве источника. Можете ли вы воспроизвести этот источник в автономном GStreamer без проблем?

...