QMultimedia Video

Alles rund um die Programmierung mit Qt
Antworten
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

QMultimedia Video

Beitrag von Mr.Crank »

Moin zusammen,

ich versuche mich gerade an einer kleinen Videoplayer Aufgabe. Ich versuche ein Video abzuspielen, welches ich zu Laufzeiten mit einem berechneten Wert in der Abspielgeschwindigkeit zu verändern. Hierfür habe ich mir ein kleines Testprogramm geschrieben um mit der Mediabibli vertraut zu werden.

Code: Alles auswählen

#include "videoplayer.h"
#include "ui_videoplayer.h"

VideoPlayer::VideoPlayer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::VideoPlayer)
{
    ui->setupUi(this);

    _player = new QMediaPlayer(this);
    _videoWidget = new QVideoWidget();
    _slower = new QPushButton("slow down");
    _faster = new QPushButton("speed up");

    connect(_slower, SIGNAL(clicked()), this, SLOT(slowDown()));
    connect(_faster, SIGNAL(clicked()), this, SLOT(speedUp()));

    QString fileName = QFileDialog::getOpenFileName(this,"Open",QDir::homePath());

    _player->setMedia(QUrl::fromLocalFile(fileName));

    qDebug()<<fileName;

    //create layout
    _player->setVideoOutput(_videoWidget);
    QBoxLayout* layout = new QVBoxLayout();
    layout->addWidget(_videoWidget);
    layout->addWidget(_slower);
    layout->addWidget(_faster);

    ui->centralWidget->setLayout(layout);

    _player->play();

    qDebug()<<_player->errorString();
    qDebug()<<_player->mediaStatus();
    qDebug()<<_player->duration();
    qDebug()<<_player->playbackRate();
}

VideoPlayer::~VideoPlayer()
{
    delete ui;
}

void VideoPlayer::slowDown(void)
{
    _speed = _speed-0.10;
    _player->setPlaybackRate(_speed);
    qDebug()<<_player->duration();
    qDebug()<<_player->playbackRate();
}

void VideoPlayer::speedUp(void)
{
    _speed = _speed+0.10;
    _player->setPlaybackRate(_speed);
    qDebug()<<_player->duration();
    qDebug()<<_player->playbackRate();
}
Über die Pushbuttons änder ich jeweils die Abspielgeschwindigkeit nach oben oder unten, leider liegt hier auch mein Problem. Der Wert _player->playbackRate(); ändert sich aber im Video ansich tut sich Null. Hat jemand hierfür eine Lösung, oder ein Vorschlag was sich in Verbindung mit Qt für die Videoverarbeitung anbietet. Versuche es später mal mit der LibVLC .... schön wäre jedoch eine unkomplizierte Lösung

Besten Gruß
Mr.Crank
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: QMultimedia Video

Beitrag von Mr.Crank »

Okay.... das mit der Playbackrate lag schonmal am .wmv File ! Läuft allerdings recht ruckelig und auch nicht wie gewünscht. Hat hier denn keiner Erfahrung in Videobearbeitung mit qt/c++ ?

Ich möchte ein Video abhängig zu einem Laufzeitparameter in der Abspielgeschwindigkeit steuern. Dies soll sogar z.B. soweit verlangsamt werden können, dass wenn meine Berechnung eine quasi Pausierung berechnet auch das Video pausiert und wieder sanft anläuft (wie z.B ein Motor der stufenlos regelbar ist). Bin für jede Anregung echt dankbar. Hat jemand schonmal mit QtAV oder FFMPEG gearbeitet ?

Besten Gruß
Mr.Crank
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QMultimedia Video

Beitrag von veeman »

Ich verstehe nicht so genau was du machen willst.
Du kannst die Abspielgeschwindigkeit nicht stufenlos "drosseln", allein schon deswegen das Videos
nichts anderes sind als eine Anreihung von einzel Bilder. Und wenn die Framerate unterhalb der
verfügbaren Bilder fällt dann hast du quasi ne Diashow.
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: QMultimedia Video

Beitrag von Mr.Crank »

Im Prinzip ist es genau das was ich möchte, einzelne Frames wiedergeben. Klar ist mir bewusst das ab einer gewissen Rate das eher wie eine Diashow rüber kommt. Dem kann ich ja aber mit einer höheren fps entgegen wirken.

Mein Vorhaben sieht so aus, dass ich ein Video mit 120fps habe. Von diesem möchte ich Abhängigkeit von einer dynamisch berechneten Geschwindigkeit die Frames wiedergeben. Z.B. Autosimulator auf einer Rennstrecke. Zum Zeitpunkt t0 steht das Bild beim ersten Frame das Kfz steht, wird nun eine Beschleunigung vom Kfz detektiert, resultiert in einer Geschwindigkeitsänderung, spiele die ersten 40 Frames pro Sekunde der Streckenaufnahme. Die Geschwindigkeit erhöht sich, passend dazu wird die Fps angehoben. Dies geschieht dann bis zur Aufnahmegeschwindigkeit z.B. 100Km/h = 120fps, bei Geschwindigkeiten darüber hinaus werden einfach mehr Frames abgespielt. Kritisch ist die Anfahr- und Anhaltesituation, hier könnte ich jedoch die Frames bei einer Rate unterhalb von 25fps interpolieren um einen glatten übergang zu bekommen. Ich hoffe man kann es nun besser nachvollziehen was ich vorhabe.

Gruß Mr.Crank
Antworten