4

我正在使用 开发媒体播放器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 
4

3 回答 3

1

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

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

所以有什么问题?

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

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

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

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

    不幸的是,我目前无法vlc-qt在线找到文档(他们的网站似乎已关闭?)所以我检查了 QT 还提供了什么。我自己从来没有用过这个,所以把这个和一粒盐放在一起......

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

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

于 2020-12-12T02:53:47.453 回答
1

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

  1. 您可以使用反转视频,通过 ffmpegffmpeg看到这个和反转视频播放,例如
  2. 您可以ffmepg与 VLC 一起使用,请参阅,例如

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

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

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

    1.1。您可以尝试将AviSynth 与 VLC 一起使用。

    1.2. 您可以尝试将Avidemux与 VLC 一起使用。 过去可以使用它来反转视频(另请参阅this),但我不确定现在是否可以。我也不确定是否可以将 VLC 与 Avidemux 结合使用。

    1.3. 具有逐帧播放功能的视频播放器

    1.4. 用于 Linux 的具有逐帧向后步进的视频播放器,包括扩展上一帧

    1.5。流媒体

  2. 如何反转视频剪辑?

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

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

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

于 2020-12-13T08:57:32.177 回答
-1

LibVLC 不支持向后播放视频。

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

于 2020-11-02T03:54:15.813 回答