VLC的解析视频是之前项目中有位大哥提出来的解决方案,当时我们原有的视频解析是用的ffmpeg,因为不了解工作模式,写成了一团任何人都不想理的代码,后来这个方案出来由于不了解vlc,想写个demo,结果没成功,(后来项目在了解了ffmpeg后,优化了代码,效果很好),心里一直有个结,趁有时间,想起来了,想着试试,没想到搞了很久,感觉理解之后确实要比ffmpeg简单(个人意见,请大佬指正),写一下

心急的哥们请直接那代码包去运行

链接:https://pan.baidu.com/s/1DZoIb2xOZg0UKbCaUBoekA?pwd=gqvz
提取码:gqvz

代码如下

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <vlc/vlc.h> // 包含VLC的头文件
#include <QDebug>

QString millisecondsToHMS(qint64 milliseconds)
{
    // 将毫秒数转换为秒数
    qint64 seconds = milliseconds / 1000;

    // 计算小时、分钟和秒数
    qint64 hours = seconds / 3600;
    qint64 minutes = (seconds % 3600) / 60;
    qint64 secs = seconds % 60;

    // 格式化为字符串
    QString timeString = QString("%1:%2:%3")
            .arg(hours, 2, 10, QLatin1Char('0'))
            .arg(minutes, 2, 10, QLatin1Char('0'))
            .arg(secs, 2, 10, QLatin1Char('0'));

    return timeString;
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
    timer1=new QTimer(this);
    timer1->setInterval(1);
    connect(timer1, &QTimer::timeout, this,&MainWindow::updateTime);
    timer1->start();

}

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

void MainWindow::init()
{

    ui->sound_l->hide();
    ui->sound_l->setValue(100);
    ui->sound->setText("100");
    vlcInstance=libvlc_new(0, NULL);
    if (!vlcInstance) {
        qDebug()<< "Can't create libvlc instance";
    };

    mediaPlayer= libvlc_media_player_new(vlcInstance);
    const char* mrl="https://vd4.bdstatic.com/mda-qdaqmkfrqj32nytz/720p/h264/1712856241618582191/mda-qdaqmkfrqj32nytz.mp4?v_from_s=bdapp-unicomment-hbe";
    libvlc_media_t* m;
    m=libvlc_media_new_location(vlcInstance,mrl);

    libvlc_media_player_set_media(mediaPlayer,m);

    libvlc_media_player_set_hwnd(mediaPlayer, (void*)ui->widget->winId());
    libvlc_media_release(m);
    libvlc_media_player_play(mediaPlayer);
    ui->sound->installEventFilter(this);
    ui->sound_l->installEventFilter(this);


}


void MainWindow::updateTime()
{
    if(libvlc_media_player_is_playing(mediaPlayer)==1){
        int time = libvlc_media_player_get_time(mediaPlayer);
        ui->currentl->setText(millisecondsToHMS(time)); // 将毫秒转换为秒
        int time1=libvlc_media_player_get_length(mediaPlayer);
        ui->lengths->setText(millisecondsToHMS(time1)); // 将毫秒转换为秒
        float timerate=libvlc_media_player_get_position(mediaPlayer);
        //        qDebug()<<"timeRate"<<timerate;
        ui->rate_all->setValue(timerate*100);
    }
}

void MainWindow::on_sound_clicked()
{
    ui->sound_l->setValue(0);
}


void MainWindow::on_sound_l_sliderMoved(int position)
{
    libvlc_audio_set_volume(mediaPlayer,position);//显示音量
    ui->sound->setText(QString::number(position));
}


void MainWindow::on_pause_clicked()
{
    int isPause=libvlc_media_player_is_playing(mediaPlayer);// 获取当前播放视频的状态,1为正常播放;0为暂停
    libvlc_media_player_set_pause(mediaPlayer,isPause);//输入信号为1.则返回为0,即暂停,否则开始播放置为1;
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->sound &&event->type() ==QEvent::HoverMove) {
        ui->sound_l->show();
    }
    if (obj==ui->sound_l&&event->type() ==QEvent::HoverLeave) {
        ui->sound_l->hide();
    }
    if(obj==ui->sound&&event->type() ==QEvent::HoverLeave){
        if(ui->sound_l->isVisible()){
            ui->sound_l->hide();
        }
    }
    if(obj==ui->sound_l&&event->type() ==QEvent::HoverMove){
            ui->sound_l->show();
    }
    // 对于其他事件,继续正常处理
    return QObject::eventFilter(obj, event);
}


void MainWindow::on_rate_all_valueChanged(int value)
{
    float rate=float(value)*0.01;
    libvlc_media_player_set_position(mediaPlayer,rate);
}


void MainWindow::on_rate_all_sliderPressed()
{
    timer1->stop();
    pause=libvlc_media_player_is_playing(mediaPlayer);//获取被拖动前的视频播放状态
    libvlc_media_player_set_pause(mediaPlayer,1);//暂停视频,以防被视频播放移动的滚动条覆盖;
}


void MainWindow::on_rate_all_sliderReleased()
{
    timer1->start();
    if(pause){//使视频滚动条被释放时返回被拖动前的状态
        pause=0;
    }else{
        pause=1;
    }
    libvlc_media_player_set_pause(mediaPlayer,pause);//维持视频的播放状态;
}

详细的细节今天不想写了,我这个写得很简单了,实现了暂停,播放进度随意拖动,音量调节,主要是在最开始的时候实现第一次视频解析的时候很费劲,找了半天问题我的pro文件如下

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

win32: LIBS += -L$$PWD/lib/ -lvlc

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

win32: LIBS += -L$$PWD/lib/ -lvlccore

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

DISTFILES += \
    bin/release/libvlc.dll \
    bin/release/libvlccore.dll

win32: LIBS += -L$$PWD/lib/ -llibvlc

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

win32: LIBS += -L$$PWD/lib/ -llibvlccore

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

详细配置过程后面再出个教程,有点累,找了半天没几个能用的, 可能这对你们不是啥问题,有问题可以留言,我有时间会回答的

更多推荐