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();
}
5 ответов
Для всех, кто в 2016 году, QVideoWidget все еще не работает. Однако используйте виджет QGraphicsView, который содержит граф сцены, и добавьте один граф QGraphicsVideoItem к графу сцены. Кажется, работает...
ну, разве что это не совсем по центру. и есть граница 1px слева. и большую часть времени он зависает, переходя в полноэкранный режим. и я получаю ошибки типа "updateVideoFrame вызывается без AVPlayerLayer (что не должно происходить"). Прогресс!
О, и это тоже занимает около 10 раз процессор.
Вы знаете, что работает, и прекрасно работает? GStreamer. Спасибо, gstreamer. Даже интеграция в python/qt работает невероятно.
Я столкнулся с аналогичной проблемой в PyQt5. Я обошел его, установив геометрию QVideoWidget в его текущую геометрию перед воспроизведением видео. Я предполагаю, что что-то в сигнале resizeEvent должно обрабатывать масштабирование носителя и не запускается при инициализации.
После многих часов поиска ошибки, я думаю, что это ошибка в Qt на OSX, когда я смотрел это видео на YouTube https://www.youtube.com/watch?v=tGKmQy-VBX0 и пробовал код.
В видео масштабирование работает нормально, но на моей машине нет.
После игры я изменил размер 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
Если вы все еще ищете решение этой проблемы, класс QVideoWidget имеет метод setAspectRatioMode. Используйте это для масштабирования кадров видео по размеру области виджета.
Обычно режим масштабирования определяет, как видео заполняет виджет. Режим масштабирования FitInView
заставит видео заполнить соотношение сторон просмотра.
Однако этот режим масштабирования должен быть по умолчанию. Вы можете попробовать установить его вручную:
QVideoWidget *videoWidget = new QVideoWidget(&window);
videoWidget->setScaleMode(Phonon::VideoWidget::FitInView);
player->setVideoOutput(videoWidget);