Russian Qt Forum
Май 03, 2024, 06:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с потоковым видео QMediaPlayer и H264  (Прочитано 7589 раз)
Montegro
Гость
« : Ноябрь 13, 2014, 20:12 »

Доброго времени суток. Перейду сразу к делу. Есть сервер, который по TCP шлет потоковое видео с камеры (скорее всего Н264). Подключаюсь к порту - собираю информацию без проблем. Необходимо отобразить потоковое видео в виджете. Выбрал QMediaPlayer. Записываю потоковые данные в файл - VLC плеер и дефолтный плеер Win 8 (c установленными кодеками) файл воспроизводят. QMediaPlayer его не показывает - в дебаге ошибка "DirectShowPlayerService::doRender: Unresolved error code 80040200". Однако QMediaPlayer воспроизводит файлы с расширением, например AVI, так что в коде ошибки быть не должно.

По итогу вопрос:
1 - Есть ли возможность воспроизводить видео из сохраненного мною файла в QMediaPlayer в формате Н264 (mpeg4).
2 - Не понимаю как привязать потоковое видео, приходящее ко мне (TCP сокет) к QMediaPlayer, чтобы смотреть онлайн, аля стрим.

Про возможность использования библиотеки VLC плеера я знаю, этого желательно не делать.
Мне в любом случае нужно показывать это видео + параллельно записывать в файл и еще много чего с ним делать. Есть ли возможность в данной ситуации обойтись дефолтными возможностями Qt, а если нет - то что бы вы посоветовали?

Заранее большое спасибо.
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Ноябрь 13, 2014, 20:49 »

Если с кодом все исправно, плагины и пр все что нужно есть, как вы говорите, то я бы мог предположить, что вам поступает сырой поток h264. Но плееры воспроизводят поэтому не уверен на 100%.
Я задавал на этом форуме вопрос, мне советовали кое-какие вещи. В итоге я делал так:
1. Подключаюсь, получаю поток, складываю в буфер.
2. С помощью библиотеки libav получаю кадр в формате yuv420p, конвертирую его средствами этой же библиотеки в RGB, формирую QImage и отправляю в GUI-поток, где отображаю на виджете (QLabel вроде).
3. Мне советовали формировать текстуру, использовать OpenGL, но руки не дошли.

п.с. если подключаться к камере напрямую, то она (возможно, не все) напишет в заголовке Content-type, что она отдает.
Записан
Montegro
Гость
« Ответ #2 : Ноябрь 14, 2014, 19:04 »

Планигы имелись в виду для Qt? то нет, не ставил.
код вида:

    m_MPlayer = new QMediaPlayer(this);
    m_MPlayer->setMedia(QUrl::fromLocalFile("file://test.mp4"));
    m_MPlayer->setVideoOutput( m_VWidget );
    m_MPlayer->play();

Да, у меня идет сырой поток h.264. Этот поток я и направляю в файл. Плееры вин 8 его воспроизводят. QMediaPlayer - нет. Но он воспроизводит AVI - тестил открытием фильма.
Ни первую ни вторую задачу до сих пор решить не удалось. напомню, что есть ошибка "DirectShowPlayerService::doRender: Unresolved error code 80040200".
Она меня привела сюда http://msdn.microsoft.com/en-us/library/windows/desktop/dd375623%28v=vs.85%29.aspx и сюда:
https://bugreports.qt-project.org/browse/QTMOBILITY-2003
http://qt-project.org/forums/viewthread/6772/
и т.д. Пока результатов нет.
Записан
Montegro
Гость
« Ответ #3 : Ноябрь 14, 2014, 19:15 »

сейчас ошибка вот такая DirectShowPlayerService::doRender: Unresolved error code 80040240
The media type of this file is not recognized. исходя из первой ссылки.

Возможно нужно какие-нибудь хедеры дописывать в файл, или сначала скармливать плееру?
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #4 : Ноябрь 14, 2014, 20:11 »

Если есть возможность, прикрепите (или ссылку на файлообменник) 30-60 сек вашего видео.
Записан
Montegro
Гость
« Ответ #5 : Ноябрь 19, 2014, 14:54 »

Так, все заработало  m_MPlayer->setMedia(QUrl("http://192.168...:port")). Установил кодеки, но их тоже пришлось настроить, чтобы воспроизводить сырое видео "rawvideo".
Насколько я понял, QMediaPlayer использует стандартные устройства воспроизведения на системе. В случае с Windows - это DirectShow. При запуске приложения через setMedia(url) - запускается LAV Splitter (кодеки K-Lite) и видео показывается, но с задержкой, что для меня критично. Так же вычитал, что QmediaPlayer сначала буферизует данные, а только потом их показывает. Задержки со стороны сервера нет - проверял. При чтении данных из файла - видео не показывается с ошибкой DirectShow, но, думаю, это решаемо. Итого впоросы:
1 - Можно ли отключить буферизацию в QMediaPlayer или каким - нибудь образом убрать задержку. Разные флаги вида QMediaPlayer::StreamPlayback - пробовал - толку 0.
2 - Есть ли возможность воспроизводить видео из какого-либо потока и т.п., например QBuffer, QLocalSocket и т.п. Изсходя из метода setMedia(const QMediaContent & media, QIODevice * stream = 0) - это возможно, но как бы я не пробовал - ничего не выходило, будь то сокет, буффер, файл и т.п., только через URL. Поднимал локальный сервер и перенаправлял данные в него, но через QURL("имя локального сервера") - он к нему не конектился.

Заранее благодарю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.