Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Emmk
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
Завершенные тесты: 1
1

Подтормаживания видео в QMediaPlayer

18.05.2016, 13:43. Просмотров 365. Ответов 9
Метки нет (Все метки)

Добрый всем день!

Имеется код который тянет видео файл с инета (https) и воспроизводит его в стандартном QMediaPlayer, по окончанию видео срабатывает соответствующий слот запрашивающий новую ссылку с видео и так по кругу.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
Shell::refreshVideoLink(QMediaPlayer::State state)
{
    if (state == QMediaPlayer::StoppedState)
        videoNetworkManager->get(QNetworkRequest(QUrl::fromEncoded("https://тут_ссылка_отдающая_JSON")));
}
 
void
Shell::videoLinkLoadFinished (QNetworkReply *reply)
{
    QJsonDocument jsonDocument = QJsonDocument::fromJson(reply->readAll());
    QJsonObject jsonObject = jsonDocument.object();
 
    videoPlayer->setMedia(QUrl(jsonObject["url_mp4"].toString()));
    videoPlayer->play();
 
    reply->deleteLater();
}
и коннекты из конструктора:
C++ (Qt)
1
2
connect(videoPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(refreshVideoLink(QMediaPlayer::State)));
connect(videoNetworkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(videoLinkLoadFinished(QNetworkReply*)));
В совершенно непредсказуемый момент времени, любое видео в любом месте может зафризиться. Это может произойти через неделю, а может через час. Все видео в формате HD, то есть 720 пикселей по высоте с фрейм-рейтом 25. Замечено, что при фреймрейте или высоте кадра выше частота возникновения фризов увеличивается.

Пропускная способность каналов 200 мегабит в секунду (гоняет по локалке). Видеоролики сами по себе не очень тяжелые (50-100 мегабайт). Вешал обработчики почти на все сигналы QMediaPlayer, особенно QMediaPlayer::error(). Абсолютно ничего не показало.

Операционная система: Mac OS X 10.11.4 El Capitan
Qt: 5.5.1


Уважаемые знатоки, с чем могут быть связанны фризы видео и как это можно решить? В случае, если это из-за кодеков, то есть ли в Qt способ задать определенный видео-кодек (через QVideoDeviceSelectorControl или что-то подобное)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2016, 13:43
Ответы с готовыми решениями:

Не воспроизводит видео QMediaPlayer + QVideoWiget
Воспроизводится только звук видео. В виджете же "висит" картинка начала видео....

Длина видео через QMediaPlayer
Добрый вечер! Мне необходимо узнать длительность видеофайла. Делаю это...

QMediaPlayer для вставки видео
Здравствуйте! Помогите, пожалуйста! =) Пытаюсь сделать несложную вроде бы...

Потоковое видео QMediaPlayer и формат H264
Доброго времени суток. Перейду сразу к делу. Есть сервер, который по TCP шлет...

QMediaPlayer::duration не определяет длину видео-файла
Доброго времени суток, уважаемые! Пытаюсь получить длину видеофайла следующим...

9
nmcf
6410 / 5672 / 2581
Регистрация: 14.04.2014
Сообщений: 23,998
18.05.2016, 15:19 2
А если локальный файл воспроизводить? То, что там 200 Мегабит, не означает, что скорость будет такой постоянно. Сеть может быть загружена.
0
Emmk
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
Завершенные тесты: 1
18.05.2016, 15:37  [ТС] 3
nmcf, локальный файл по одиночке фризов не давал никогда, однако в режиме долгой работы приложения эта ситуация не проверялась. Требование техзадания такого, что бы видеофайлы брались именно с какого-то централизованного хранилища по сети. Впрочем, ничто не мешает скачивать их и класть локально. Я проверю этот вариант.

Добавлено через 10 минут
Ну и кстати, если бы были проблемы с сетью, обработчик на QMediaPlayer::error() выдавал бы QMediaPlayer::NetworkError
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
18.05.2016, 16:02 4
Цитата Сообщение от Emmk Посмотреть сообщение
Ну и кстати, если бы были проблемы с сетью, обработчик на QMediaPlayer::error() выдавал бы QMediaPlayer::NetworkError
Если бы это была критичная проблема(к примеру обрыв связи) - то это было бы так. А так - смотрите внимательнее на QMediaPlayer::MediaStatus. Скорее всего он будет ругаться на QMediaPlayer::StalledMedia.
0
Emmk
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
Завершенные тесты: 1
19.05.2016, 10:34  [ТС] 5
Wyn, к сожалению, последнее что он выдает QMediaPlayer::MediaStatus перед зависоном это QMediaPlayer::BufferedMedia, то есть закончил буфферизировать, QMediaPlayer::State выдает QMediaPlayer::PlayingState, QMediaPlayer::Error говорит QMediaPlayer::NoError

Добавлено через 18 часов 8 минут
В общем, следственный эксперимент с воспроизведением видео локально проблем (пока) не выявил

В связи с этим опять напрашивается вопрос - если имеют место проблемы с сетью, как можно это диагностировать? Учитывая, что видео буферизировано на 100%, ошибок сети нет и вообще все прекрасно?
0
icpu
478 / 359 / 91
Регистрация: 10.03.2011
Сообщений: 1,508
Записей в блоге: 4
19.05.2016, 11:01 6
Если буферизация проходит полностью, можно грешить на ошибки канала. Попробуйте передать что-то очень большое и проверить на совпадение. Если всё норма, остаётся грешить только на файловую систему, куда сбрасывается временный файл
0
Emmk
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
Завершенные тесты: 1
19.05.2016, 11:17  [ТС] 7
Уже начали снифать канал TcpDump'ом. Поглядим что происходит в момент фриза в сети. Отпишусь по результатам.
0
Emmk
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
Завершенные тесты: 1
24.05.2016, 10:09  [ТС] 8
В общем, TCP dump показал неадекватное использование компонентом сетевого стека макоси. Компонент запрашивает часть видео, буферизует ее, затем закрывает соединение (wtf?) а сервер продолжает слать пакеты. Компонент их отфутболивает обратно, затем все по новой, открывает соединение и требует новые пакеты. В один прекрасный момент они не могут договорится и видимо буфер оказывается пустым и пакеты новые не приходят.
Короче говоря от компонента пришлось отказаться, заменили на LibVLC, пока работает намного стабильней. Всем спасибо за содействие!
0
nmcf
6410 / 5672 / 2581
Регистрация: 14.04.2014
Сообщений: 23,998
24.05.2016, 15:00 9
Emmk, ты глубоко копнул. Надо было компонент допилить.
0
Emmk
74 / 74 / 30
Регистрация: 12.02.2016
Сообщений: 199
Завершенные тесты: 1
24.05.2016, 15:11  [ТС] 10
nmcf, с удовольствием бы покопался в исходниках компонента, но совсем нет на это времени. дедлайн близок позже попробую оформить как баг в официальный багтрекер Qt, может пройдет
0
24.05.2016, 15:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2016, 15:11

QMediaPlayer
Здравствуйте! В приложении нужно добавить музыку. Хочу это сделать через...

QMediaPlayer и *.AVI
Здравствуйте. Создал плеер с использованием QMediaPlayer. При просмотре...

Запись аудио из QMediaPlayer
Доброго времени суток! Возникла насущная необходимость записать звук с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru