2016-07-14 23 views
2

Ich möchte ein Video in einer Qt-Anwendung wiedergeben. Dies ist mein Code so weit:QVideoWidget: Video ist abgeschnitten

#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(); 
} 

Das Problem: Das Video gezeigt wird, und spielt wieder normal, aber das Video der Größe nicht in der QVideoWidget passen. Der Teil des Videos, der größer als das Widget ist, wird abgeschnitten.

Vielen Dank im Voraus!

EDIT: reduziert ich den Code und bemerkt, dass, wenn die Anwendung das Video beginnt abgeschnitten ist, aber wenn ich die Größe des Fensters mit der Maus an die Größe passt eigentlich:

#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(); 
} 

Antwort

0

Normalerweise ist die Skala Modus bestimmt, wie das Video das Widget füllt. Der Skalierungsmodus FitInView erzwingt, dass das Video das Ansichtsverhältnis einhält.

Dieser Skalenmodus sollte jedoch standardmäßig eingestellt sein. Sie können versuchen, es manuell einstellen:

QVideoWidget *videoWidget = new QVideoWidget(&window); 
videoWidget->setScaleMode(Phonon::VideoWidget::FitInView); 
player->setVideoOutput(videoWidget); 
+0

Vielen Dank für Ihre schnelle Antwort, aber ich bin nicht in der Lage, Phonon zu verwenden, wenn ich Phonon zu QT hinzufügen (QT + = Phonon) Ich bekomme den Fehler: Unbekannte Modul (e) in QT: phonon.Ich führe OSX btw, was soll ich tun, um es zu konfigurieren/zu installieren? – Stefan

+0

Unglücklicherweise, ich bin nicht vertraut mit Qt/Phonon auf OSX.Es gibt ziemlich ein paar Fragen zu diesem Thema [hier] (http: // stackoverfl ow.com/search?q=phonon+osx), vielleicht hilft das. – Exa

+0

Gibt es auch eine Option ohne Phonon, wie gelesen, dass Phonon nicht mehr Teil von Qt5 ist? – Stefan

1

Nach vielen Stunden für den Fehler suchen, ich denke, das ist ein Fehler in Qt auf OSX ist, wie ich dieses YouTube-Video angeschaut https://www.youtube.com/watch?v=tGKmQy-VBX0 und versuchte den Code aus.

In der Video-Skalierung funktioniert gut, aber auf meiner Maschine nicht.

+0

Dies passiert (noch) auf os x und fedora 24. Seufz. Und Ubuntu? Ihr qtmultimedia-Paket ist so kaputt, es verwendet gstreamer 0.1 und sie liefern es nicht einmal. Benutzt jemand diese Scheiße überhaupt? – KarlP

0

Für alle im Jahr 2016 ist QVideoWidget immer noch kaputt. Verwenden Sie jedoch ein QGraphicsView-Widget, das ein Szenengraph enthält, und fügen Sie dem Szenegraphen ein einzelnes QGraphicsVideoItem hinzu. Scheint zu funktionieren ...

gut, außer dass es nicht genau zentriert ist. und es gibt einen 1px Rand auf der linken Seite. und es hängt die meiste Zeit im Vollbildmodus. und ich bekomme Fehler wie „updateVideoFrame ohne AVPlayerLayer genannt (was nicht passieren sollte.“ Fortschritt!

.. oh, und es dauert bis zu 10x die CPU zu.

Sie wissen, was funktioniert, und Werke Danke, gstreamer. Sogar die Integration in python/qt funktioniert fabelhaft.