2016-07-14 1 views
2

Je souhaite lire une vidéo dans une application Qt. Ceci est mon code à ce jour:QVideoWidget: la vidéo est coupée

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

Le problème: La vidéo est affichée et reproduit normalement, mais la vidéo ne redimensionne pas pour entrer dans le QVideoWidget. La partie de la vidéo qui est plus grande que le widget est coupée.

Merci d'avance!

EDIT: Je réduit le code et a remarqué que, lorsque l'application démarre la vidéo est coupée, mais quand je redimensionnez la fenêtre à l'aide de la souris, il correspond effectivement à la taille:

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

Répondre

0

Habituellement l'échelle Le mode dicte comment la vidéo remplit le widget. Le mode d'échelle FitInView force la vidéo à remplir le format d'affichage de la vue.

Toutefois, ce mode d'échelle doit être le mode par défaut. Vous pouvez essayer de le régler manuellement:

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

Merci pour votre réponse rapide, mais je ne suis pas capable d'utiliser Phonon, quand j'ajoute phonon à QT (QT + = phonon) Je reçois l'erreur: Module (s) inconnu (s) dans QT: phonon.J'exécute OSX btw, que dois-je faire pour le configurer/l'installer? – Stefan

+0

Malheureusement, je ne suis pas familier avec l'utilisation de Qt/Phonon sur OSX. quelques questions sur ce sujet [ici] (http: // stackoverfl ow.com/search?q=phonon+osx), peut-être que cela aide. – Exa

+0

Existe-t-il aussi une option sans Phonon, comme l'indique Phonon qui ne fait plus partie de Qt5? – Stefan

1

Après de nombreuses heures de recherche de l'erreur, je pense que ce bogue dans Qt sur Mac OS X, comme je l'ai regardé cette vidéo YouTube https://www.youtube.com/watch?v=tGKmQy-VBX0 et essayé le code.

Dans la vidéo mise à l'échelle fonctionne très bien, mais sur ma machine pas.

+0

Cela (encore) arrive sur os x et fedora 24. Soupir. Et Ubuntu? Leur paquet qtmultimedia est tellement cassé, il utilise gstreamer 0.1 et ils ne l'expédient même pas. Est-ce que quelqu'un utilise même cette merde? – KarlP

0

Pour tout le monde en 2016, QVideoWidget est toujours en panne. Cependant, utilisez un widget QGraphicsView, qui contient un graphe de scène, et ajoutez un seul QGraphicsVideoItem au graphe de scène. Semble fonctionner ...

bien, sauf que ce n'est pas exactement centré. et il y a une bordure 1px sur la gauche. et ça passe en plein écran la plupart du temps. et je reçois des erreurs comme « updateVideoFrame appelé sans AVPlayerLayer (qui ne devrait pas arriver. » progrès!

.. oh, et il faut environ 10 fois la cpu aussi.

Vous savez ce qui fonctionne, et des œuvres génial? GStreamer Merci, gstreamer Même l'intégrer en python/qt fonctionne fabuleusement