利用vlc解析在线视频流,环境windows
·
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
详细配置过程后面再出个教程,有点累,找了半天没几个能用的, 可能这对你们不是啥问题,有问题可以留言,我有时间会回答的
更多推荐


所有评论(0)