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

How to play video backwards in qt using vlc-qt libvlc

我正在使用 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 

LibVLC 不支持向后播放视频。

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

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

此功能通常不受支持的原因在于视频编解码器本身的性质。基本上没有视频播放器提供该选项并非巧合,我检查了 VLC Media Player、Media Player Classic、Windows Films & TV 和 Windows Media Player,其中 none 支持它.我尝试过的唯一可以做到这一点的软件是 DaVinci Resolve 视频编辑软件,即使在那里,问题也很明显:向前播放很流畅,向后播放时异常不稳定(除非播放低分辨率文件时,它确实有效很好)。

那么问题是什么?

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

要真正实现这一点,您基本上必须首先计算“正向”模式下两个关键帧之间的所有帧,然后反转它们的顺序。因为视频解码通常涉及大量硬件加速,所以实现这样的事情一点也不简单。 “幼稚”的方法可能会导致糟糕的表现。

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

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

    不幸的是,我目前无法在网上找到 vlc-qt 文档(他们的网站似乎已关闭?)所以我检查了 QT 还提供了什么。我自己从来没有用过这个,所以对此持保留态度...

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

  2. 因此,如果您对自己的项目更认真,我建议您要么寻找支持此类功能的库,要么只是做几乎所有其他视频播放器都做的事情,快速跳回小步骤...

VLC 没有这个功能。 作为解决方法,您可以尝试使用 ffmpeg 的 VLC。 我从未使用过它,但是:

  1. 您可以使用 ffmpeg 反转视频,请参阅 this and Reverse video playback through ffmpeg,例如
  2. 您可以将 ffmepg 与 VLC 一起使用,请参阅 this,例如

所以我猜你可以用这个解决方案完成你需要的。

其他相关资源,我不确定是否对您有帮助

  1. 您可以尝试将其他开源替代方案与 VLC 结合使用,类似于上面针对 ffmpeg.

    的建议

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

    1.2。您可以尝试在 VLC 中使用 AvidemuxIt used to be possible to reverse a video with it (see also this), but 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, including the extension 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 结合使用吗?