Воспроизведение видеопотока RTP с помощью Qt?

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

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

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

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

  • Ubuntu 9.10
  • Qt 4.6

мои вопросы:

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

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

2 ответов


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

здесь ссылка на образец libVLC.


Как я понимаю, Phonon работает, по крайней мере, в Windows, что QT предоставляет плагин Phonon для 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 без каких-либо проблем?