如何使用vlc-qt libvlc在qt中向后播放视频

问题描述

我正在使用vlc-qt开发媒体播放器,实际上,我想要一个可以播放的按钮来进行向后快速操作。我没有快进操作的问题,但是无法实现快退操作,vlc-qt中是否有任何功能可以向后播放视频。 这是我用于快进和快退操作的按钮代码

void expPlayer::on_pushButton_2_clicked()
{
    m_player->setPlaybackRate(m_player->playbackRate()+1);
}

void expPlayer::on_pushButton_3_clicked()
{
    //It should play the video backward with more playback rate.
}

这是我的完整代码

#ifndef EXPPLAYER_H
#define EXPPLAYER_H

#include <QMainWindow>
#include "VLCQtCore/Instance.h"
#include "VLCQtCore/MediaPlayer.h"
#include "VLCQtCore/Media.h"
#include "VLCQtCore/Common.h"
#include "VLCQtCore/Config.h"
#include "QPushButton"
#include "QtMultimedia/QMediaPlaylist"
#include "VLCQtWidgets/WidgetVideo.h"
#include "VLCQtWidgets/WidgetSeekProgress.h"
#include "QSlider"
#include "QFileDialog"
#include "QInputDialog"
#include "QLabel"
#include "QListView"
#include "QBoxLayout"
#include "VLCQtWidgets/WidgetSeek.h"
QT_BEGIN_NAMESPACE
namespace Ui { class expPlayer; }
QT_END_NAMESPACE

class expPlayer : public QMainWindow
{
    Q_OBJECT

public:
    expPlayer(QWidget *parent = nullptr);
    ~expPlayer();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();
    
    void on_pushButton_3_clicked();
    
private:
    Ui::expPlayer *ui;

    VlcInstance *m_instance;
    Vlcmedia *m_media;
    VlcmediaPlayer *m_player;
    VlcWidgetSeekProgress *m_progressBar;
};
#endif // EXPPLAYER_H

#include "expplayer.h"
#include "ui_expplayer.h"

expPlayer::expPlayer(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::expPlayer)
{
    ui->setupUi(this);
    m_instance = new VlcInstance(VlcCommon::args(),this);
    m_player = new VlcmediaPlayer(m_instance);

    m_player->setVideoWidget(ui->m_video);
    ui->m_video->setMediaPlayer(m_player);
    m_progressBar=new VlcWidgetSeekProgress(this);
    m_progressBar->setMediaPlayer(m_player);
    ui->m_video->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
    ui->m_video->show();

    m_media = new Vlcmedia("http://www.youtube.com/watch?v=Btv7G0BV45g",m_instance);
    m_player->open(m_media);
    qDebug()<<"m_player->video():"<<m_player->video();
    m_player->play();

    m_progressBar->resize(ui->m_video->width(),30);
    m_progressBar->move(ui->m_video->x(),ui->m_video->y()+ui->m_video->height()+20);
    m_progressBar->show();

}

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


void expPlayer::on_pushButton_clicked()
{



}

void expPlayer::on_pushButton_2_clicked()
{
    m_player->setPlaybackRate(m_player->playbackRate()+1);
}

void expPlayer::on_pushButton_3_clicked()
{
    //It should play the video backward with more playback rate.
}
qt 

解决方法

这并不是真正解决您的问题的方法,而是有关为什么您找不到满意答案的一些信息。

通常不支持此功能的原因在于视频编解码器本身的本质。绝非偶然的是,基本上没有视频播放器提供该选项,我检查了VLC Media Player,Media Player Classic,Windows电影和电视以及Windows Media Player,它们都不支持。我试用过的唯一可以做到这一点的软件是DaVinci Resolve视频编辑软件,即使在那儿,问题也很明显:向前播放很流畅,向后奇怪地起伏(除非在播放低分辨率文件时起作用)很好)。

那是什么问题?

在大多数视频编解码器中,视频数据由一些关键帧组成,这些关键帧由许多中间帧分隔。这些中间帧实际上并不包含单独渲染它们所需的所有必要数据,它们只包含很少的数据,因此无法根据前一帧进行计算。在video中可以找到有关其工作原理的很好的基本解释。在这一点上,应该已经很清楚为什么逆转此过程可能会有问题。

要真正实现此目的,您基本上必须首先以“前进”模式计算两个关键帧之间的所有帧,然后颠倒它们的顺序。由于视频解码通常涉及大量的硬件加速,因此实现这样的操作并非易事。 “幼稚”的方法可能会导致糟糕的性能。

由于似乎vlc-qt不支持它,我想说您的选择取决于您要实现的目标。

  1. 如果您只是想玩一点儿,可以尝试自己实现反转:

    不幸的是,我目前无法在线上找到vlc-qt文档(它们的站点似乎已关闭?),所以我检查了QT还提供了什么。我从来没有自己做过,所以带一点盐...

    有一类叫QVideoFrame的类,它基本上封装了解码视频帧的像素数据。请注意,解码的视频数据比编码的文件占用更多的内存,因此,我建议将视频分成较小的部分(除非您要播放的视频文件非常非常小),然后加载将其中一部分分解为QVideoFrame个对象的向量,然后反转该向量并播放结果的帧序列。即使这行得通,性能也可能会很糟糕...

  2. 因此,如果您对项目更认真,建议您要么寻找一个支持这种功能的库,要么只是做几乎所有其他视频播放器都可以做的事情,然后迅速跳回来。

,

VLC没有此功能。 解决方法是,您可以尝试使用ffmpeg进行VLC。 我从没用过,但是:

  1. 您可以使用ffmpeg来反转视频,例如,参见thisReverse video playback through ffmpeg
  2. 您可以在VLC中使用ffmepg,例如,参见this

所以我想您可以使用此解决方案完成您需要的工作。

我不确定其他相关来源会对您有帮助

  1. 您可以尝试将其他开放源代码替代品与VLC结合使用,类似于上面对ffmpeg的建议。

    1.1。您可以尝试使用AviSynth with VLC

    1.2。您可以尝试将Avidemux与VLC结合使用。 It used to be possible to reverse a video和它(另请参阅this),但I am not sure it is possible nowadays。 我不确定是否可以将VLC与Avidemux结合使用。

    1.3。 Video players that have frame by frame playback feature

    1.4。 Video player with backward frame by frame stepping for Linux,包括扩展名Previous Frame

    1.5。 Gstreamer

  2. How can I reverse a video clip?

  3. https://forum.videolan.org/viewtopic.php?t=139871

  4. https://forum.videohelp.com/threads/345380-video-player-that-can-step-forward-backwards-and-change-play-speed

注意:OpenShot是另一个可以向后播放的开源软件...您敢尝试将其与VLC结合吗?

,

LibVLC不支持向后播放视频。

不过,您可以更改位置或时间属性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...