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

如何解决如何使用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不支持向后播放视频。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?