[Windows, Qt5, QMediaPlayer, QMediaPlaylist]: крошечный черный экран продолжительностью при смене текущего источника видео

Я пишу видеоплеер с Qt5::QMediaPlayer для случайного воспроизведения некоторых видео в течение случайной продолжительности, как это:

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    QMediaPlaylist* playlist = new QMediaPlaylist(&a);
    playlist->addMedia(QUrl::fromLocalFile("./Resources/fractal-files/A-060405V4651.WMV"));
    playlist->addMedia(QUrl::fromLocalFile("./Resources/fractal-files/E-102604.WMV"));
    playlist->addMedia(QUrl::fromLocalFile("./Resources/fractal-files/C-102304.WMV"));

    QMediaPlayer* player = new QMediaPlayer(&a);
    player->setPlaylist(playlist);

    QVideoWidget* videoWidget = new QVideoWidget;
    player->setVideoOutput(videoWidget);

    player->play();
    videoWidget->show();

    QTimer* t = new QTimer;
    QObject::connect(t, &QTimer::timeout, [&](){
        playlist->setCurrentIndex(playlist->nextIndex());
        player->play();
        videoWidget->setWindowTitle(playlist->currentMedia().canonicalUrl().fileName());
        t->start((qrand()%5 + 5)*1000);
    });
    t->start((qrand()%5 + 5)*1000);

    QTimer* t2 = new QTimer;
    QObject::connect(t2, &QTimer::timeout, [&](){
        player->setPosition(qrand() % player->duration());
        videoWidget->setWindowTitle(playlist->currentMedia().canonicalUrl().fileName());
        t2->start((qrand()%2 + 2)*1000);
    });
    t2->start((qrand()%2 + 2)*1000);

    return a.exec();
}

Есть две проблемы:
1. При изменении позиции

player->setPosition(qrand() % player->duration());

есть небольшая задержка (мой клиент может принять это, но лучше плавно)
2. Когда источник видео изменился с помощью:

playlist->setCurrentIndex(playlist->nextIndex());
player->play();

есть черный экран небольшой продолжительности, который не нужен клиенту. Он хочет, чтобы эффект был как минимум таким же, как при смене позиции:

player->setPosition(qrand() % player->duration());

Можем ли мы убрать этот черный экран при смене источника видео с помощью Qt5 в Windows? Или мы можем сделать это с другими библиотеками/фреймворками (воспроизвести список видео без пробелов в черном экране при смене источника видео)? (На MacOs переключение плавное)
Большое спасибо!


person aviit    schedule 02.11.2015    source источник
comment
Это относительный вопрос: stackoverflow.com/questions/27517619/   -  person aviit    schedule 02.11.2015
comment
У меня есть несколько советов по использованию QMediaGaplessPlayback Control, но мне это не удалось.   -  person aviit    schedule 04.11.2015


Ответы (1)


Это зарегистрированная ошибка в QtMediaPlayer, и она возникает только в Windows. В текущем API, когда медиафайл достигает конца, проигрыватель очищает область видео для воспроизведения следующего медиафайла. Переход не является плавным и приводит к недопустимым кадрам. В качестве обходного пути в зацикленном видео можно изменить положение на нужный кадр в том же медиа.

Если вам нужно изменить носитель, вы можете попробовать использовать два объекта медиаплеера: один для текущего носителя, а другой для следующего носителя. Когда пришло время воспроизвести следующий медиафайл, измените положение проигрывателя на 0 и отобразите его на виджете. Это указано в ссылке на отчет об ошибке. Это грязно и все еще не полное решение.

Итак, что делать?

  1. Вы можете дождаться исправления Qt. Об ошибке, кажется, сообщили 2-3 месяца назад.

  2. Изменить медиаплеер (у Gstreamer есть поддержка непрерывного/бесшовного видео). Вы, безусловно, можете встроить медиаплеер в свой пользовательский интерфейс, разработанный с помощью Qt. Есть примеры.

  3. Переместите другую библиотеку пользовательского интерфейса, которая предлагает лучшие функции воспроизведения мультимедиа.

Я бы пошел с порядком 2-1-3. Попробуйте встроить другой медиаплеер и подождите пару месяцев, пока он исправит ошибку.

person Ockhius    schedule 19.03.2016