【问题标题】:How to play video backwards in qt using vlc-qt libvlc如何使用 vlc-qt libvlc 在 qt 中向后播放视频
【发布时间】:2026-01-05 22:30:01
【问题描述】:

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

【问题讨论】:

    标签: c++ qt libvlc vlc-qt


    【解决方案1】:

    VLC 没有此功能。 作为一种解决方法,您可以使用ffmpeg 尝试 VLC。 我没用过,但是:

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

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

    其他相关来源,我不确定它们是否会对您有所帮助

    1. 您可以尝试将其他开源替代方案与 VLC 结合起来,类似于上面为 ffmpeg 建议的那样。

      1.1。你可以试试AviSynthwith 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 结合吗?

    【讨论】:

    • 是的,我可以看到你提供了很多参考,我会检查它们,如果你能提供一些带有代码 @sancho.sReinstateMonicaCellio 的工作示例,我会很高兴
    • 如前所述,我从未使用过这些组合。我指出了我的第一选择,因为ffmpeg 已经成熟并得到很好的支持,并且有链接表明它应该是可行的。 AFAICT,这让你比原来更接近你的目标。更进一步的工作代码是另一项工作......
    • 好的先生,我会试试这些东西,你的回答并没有解决我的整个问题,但找到我的解决方案是最有帮助的,所以我接受这个答案。
    【解决方案2】:

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

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

    那么问题出在哪里?

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

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

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

    1. 如果你只是想玩一玩,你可以尝试自己实现倒车:

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

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

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

    【讨论】:

    • 对。在我看来,要走的路是向后寻找,直到找到最近的关键帧,然后前进并解码直到完成。你还应该缓存这些解码帧,所以它是 O(n) 而不是 O(n^2)
    • 我已经知道您在第二点中讨论的逻辑,您可以查看我在上一个答案中的评论。是的,这个答案对我没有帮助,因为我已经知道这种情况。但是感谢您的宝贵时间。
    【解决方案3】:

    LibVLC 不支持向后播放视频。

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

    【讨论】:

    • 更改时间属性只会改变视频的位置,但我想要视频的反转,有什么方法可以将所有视频帧存储在QByteArray 或其他一些数据中结构并从头到尾循环遍历它。
    最近更新 更多