QVideoWidget: Видео обрывается

Я хочу воспроизвести видео в приложении Qt. Это мой код до сих пор:

#include <QApplication>
#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QUrl>

#include <iostream>

using namespace std;

const int WIDTH = 1280;
const int HEIGHT = 720;

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

    QWidget window;
    window.resize(WIDTH, HEIGHT);
    window.setWindowTitle("Video Test");
    window.show();

    QMediaPlayer *player = new QMediaPlayer();
    player->setMedia(QUrl::fromLocalFile("/Path/To/Video.mp4"));

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

    videoWidget->resize(WIDTH, HEIGHT);

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


    return app.exec();
}

Проблема: Видео показывается и воспроизводится нормально, но видео не изменяет размер, чтобы поместиться в QVideoWidget. Часть видео, которая больше виджета, обрезается.

Заранее спасибо!

РЕДАКТИРОВАТЬ: я уменьшил код и заметил, что при запуске приложения видео обрезается, но когда я изменяю размер окна с помощью мыши, оно фактически соответствует размеру:

#include <QApplication>
#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QUrl>

#include <iostream>

using namespace std;

const int WIDTH = 1280;
const int HEIGHT = 720;

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

    QMediaPlayer *player = new QMediaPlayer();
    QVideoWidget *videoWidget = new QVideoWidget();

    player->setVideoOutput(videoWidget);

    player->setMedia(QUrl::fromLocalFile("/Path/To/Video.mp4"));
    player->play();

    videoWidget->resize(WIDTH/3, HEIGHT/3);

    videoWidget->show();

    return app.exec();
}

person Stefan    schedule 14.07.2016    source источник


Ответы (6)


После многих часов поиска ошибки я думаю, что это ошибка в Qt на OSX, поскольку я смотрел это видео на YouTube https://www.youtube.com/watch?v=tGKmQy-VBX0 и попробовал код.

В видео масштабирование работает нормально, а на моей машине нет.

person Stefan    schedule 14.07.2016
comment
Это (до сих пор) происходит на OS X и Fedora 24. Вздох. А убунту? Их пакет qtmultimedia настолько сломан, что он использует gstreamer 0.1, и они даже не отправляют его. Кто-нибудь вообще пользуется этим дерьмом? - person Karl Pickett; 08.08.2016

Для тех, кто в 2016 году, QVideoWidget все еще не работает. Однако используйте виджет QGraphicsView, который содержит граф сцены, и добавьте один QGraphicsVideoItem в граф сцены. Кажется, работает...

ну, за исключением того, что это не совсем по центру. и слева есть граница в 1 пиксель. и он зависает при переходе в полноэкранный режим большую часть времени. и я получаю сообщения об ошибках типа «updateVideoFrame вызывается без AVPlayerLayer (чего не должно происходить»). Прогресс!

.. о, и это тоже требует примерно 10-кратного процессора.

Вы знаете, что работает, и работает отлично? GStreamer. Спасибо, gstreamer. Даже его интеграция в python/qt работает великолепно.

person Karl Pickett    schedule 08.08.2016
comment
Не могли бы вы рассказать мне, как вы интегрируете GStreamer. - person Vencat; 20.05.2019

Я столкнулся с аналогичной проблемой в PyQt5. Я работал над этим, установив геометрию QVideoWidget в ее текущую геометрию перед воспроизведением видео. Я предполагаю, что что-то в сигнале resizeEvent должно обрабатывать масштабирование мультимедиа и не срабатывает при инициализации.

person Skotastic    schedule 19.04.2018

После воспроизведения я изменил размер QVideoWidget на 1, а затем изменил размер до исходного размера. Определенно «выдумка», но это работает для меня, пока я не найду реальное решение: (работа с PyQt5 и High Sierra)

s1 = self.MediaFrame.size() # QVideoWidget
s2 = s1 + QSize(1, 1)
self.MediaPlayer.play() # QMediaPlayer
self.MediaFrame.resize(s2) # enlarge by one pixel
self.MediaFrame.resize(s1) # return to original size
person user3057006    schedule 07.08.2018
comment
Помогает, спасибо - person Tom Bug; 02.03.2021

Обычно режим масштабирования определяет, как видео заполняет виджет. Режим масштабирования FitInView заставит видео заполнить весь вид с сохранением соотношения сторон.

Однако этот режим масштабирования должен быть установлен по умолчанию. Можно попробовать установить вручную:

QVideoWidget *videoWidget = new QVideoWidget(&window);
videoWidget->setScaleMode(Phonon::VideoWidget::FitInView);
player->setVideoOutput(videoWidget);
person Exa    schedule 14.07.2016
comment
Спасибо за ваш быстрый ответ, но я не могу использовать Phonon, когда я добавляю phonon в QT (QT += phonon), я получаю сообщение об ошибке: Неизвестный(е) модуль(и) в QT: phonon. Кстати, я использую OSX, что мне делать, чтобы настроить/установить его? - person Stefan; 14.07.2016
comment
К сожалению, я не знаком с использованием Qt/Phonon в OSX. По этой теме довольно много вопросов здесь, возможно, это поможет. - person Exa; 14.07.2016
comment
А есть вариант без Phonon, т.к. читал, что Phonon больше не входит в состав Qt5? - person Stefan; 14.07.2016
comment
Я обновил свой вопрос до альтернативной версии без родительского виджета - person Stefan; 14.07.2016