阅读 55

采用libvlc做一个视频播放器

一、libvlc介绍

VLC这个播放器(只要涉及到软件开发)基本应该都听过用过,其功能的强大就不多说了。 VLC媒体播放器官网: www.videolan.org/

image.png

libvlc源码和库文件下载地址: ftp.heanet.ie/pub/videola…

image.png 这里面汇总了所有libvlc版本的下载地址。

要自己开发视频播放器,首先想到的库就是ffmpeg,如果想立即上手,不想理解音视频底层,快速开发一个播放器,那么直接调用libvlc是一个非常好的选择。

如果采用窗口嵌入方式,只需要很少的代码就可以开发一个能正常使用的视频播放器了。并且libvlc也支持跨平台,主流的平台官方都提供了库文件,也提供了源码,嵌入式平台可以自己交叉编译。

下面就介绍使用QT作为UI界面,调用libvlc完成一个简单的视频播放器开发,采用窗口嵌入式方式。使用的VLC版本是截止发文时的最新版本。

二、实现代码

image.png

2.1 widget.cpp

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent)     : QWidget(parent)     , ui(new Ui::Widget) {     ui->setupUi(this);     //创建并初始化libvlc实例     vlc_base=libvlc_new(0,nullptr);     this->setWindowTitle("libvlc设计的视频播放器"); } Widget::~Widget() {     delete ui; } //选择视频 void Widget::on_pushButton_open_clicked() {     /*选择文件*/     QString filename=QFileDialog::getOpenFileName(this,"选择打开的文件","D:/",tr("*.*"));     std::replace(filename.begin(), filename.end(), QChar('/'), QChar('\\'));     qDebug()<<"播放的媒体:"<<filename;     /*为特定文件路径创建媒体*/     if(vlc_media)libvlc_media_release(vlc_media);     vlc_media=libvlc_media_new_path(vlc_base,filename.toUtf8().data());     if(vlc_media==nullptr)     {         qDebug()<<"libvlc_media_new_path 执行错误.";         return;     }     /*根据给定的媒体对象创建一个播放器对象*/     if(vlc_mediaPlayer)libvlc_media_player_release(vlc_mediaPlayer);     vlc_mediaPlayer=libvlc_media_player_new_from_media(vlc_media);     /*设置给予媒体播放器媒体输出的win32/win64窗口句柄*/     libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui->widget->winId());     /*播放媒体文件*/     if(vlc_mediaPlayer)libvlc_media_player_play(vlc_mediaPlayer); } //暂停与继续 void Widget::on_pushButton_pause_clicked() {     if(vlc_mediaPlayer)libvlc_media_player_pause(vlc_mediaPlayer); } //停止 void Widget::on_pushButton_stop_clicked() {     if(vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer); } 复制代码

2.2 widget.h

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <vlc/vlc.h> #include <QDebug> #include <QFileDialog> #include <QMoveEvent> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget {     Q_OBJECT public:     Widget(QWidget *parent = nullptr);     ~Widget(); private slots:     void on_pushButton_open_clicked();     void on_pushButton_pause_clicked();     void on_pushButton_stop_clicked(); private:     Ui::Widget *ui;     libvlc_instance_t *vlc_base=nullptr;     libvlc_media_t *vlc_media=nullptr;     libvlc_media_player_t *vlc_mediaPlayer=nullptr;      Form *form; }; #endif // WIDGET_H 复制代码

2.3 pro工程文件

QT       += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0 INCLUDEPATH += $$PWD\VLC\sdk\include   #VLC头文件包含目录 INCLUDEPATH += $$PWD\VLC\sdk\include\vlc\plugins   #VLC头文件包含目录可选 INCLUDEPATH += $$PWD\VLC\sdk\include\vlc   #VLC头文件包含目录 可选 LIBS +=$$PWD\VLC\sdk\lib\libvlc.lib    #VLC库文件路径 LIBS +=$$PWD\VLC\sdk\lib\libvlccore.lib  #可选 SOURCES += \     main.cpp \     widget.cpp HEADERS += \     widget.h FORMS += \     widget.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target


作者:DS小龙哥
链接:https://juejin.cn/post/7023552394798006279


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐