介绍

  • 简单的多屏播放器
  • 最多同时播放16个视频
  • 支持本地文件和rtsp、rtmp等流媒体播放
  • VS2015工程,依赖Qt+VLC
  • 练手作品

截图


下载

程序:download.csdn.net/detail/u014755412/9908787

源码:github.com/FutaAlice/QtPlayer


代码分析

IMediaPlayer是为规定接口的基类
提供了播放和控制的几个常用函数
其中打开媒体部分拆分为了OpenURL和OpenFile,并在cpp中实现
若为Windows环境,则对QFileDialog获取的路径进行替换

/*******************************************************************
IMediaPlayer.h(接口类)
构造时传入QWidget*
调用OpenFile或OpenURL或Open打开文件并渲染窗体
*******************************************************************/#ifndef IMEDIAPLAYER_H
#define IMEDIAPLAYER_Hclass QWidget;
class IMediaPlayer
{
public:IMediaPlayer(QWidget* pWidget);virtual ~IMediaPlayer();virtual bool OpenFile();virtual bool OpenURL(const char* url);virtual bool Open(const char* url) = 0;virtual bool Play() = 0;virtual void Pause() = 0;virtual void Stop() = 0;virtual void ChangeVolume(int vol) = 0;protected:QWidget* m_pWidget;
};#endif // IMEDIAPLAYER_H
/*******************************************************************
IMediaPlayer.cpp(接口类)
*******************************************************************/
#include "IMediaPlayer.h"
#include <QtWidgets/QWidget>
#include <QtWidgets/qfiledialog.h>// Windows环境下进行字符替换
static void StrReplace(QString& str)
{
#if defined(Q_OS_MAC)       // Mac
#elif defined(Q_OS_UNIX)    // Linux
#elif defined(Q_OS_WIN)     // Windows
    str = str.replace(QRegExp("/"), "\\");
#endif
}IMediaPlayer::IMediaPlayer(QWidget* pWidget)
    : m_pWidget(pWidget)
{
}IMediaPlayer::~IMediaPlayer()
{
}bool IMediaPlayer::OpenFile()
{
    QString fileOpen = QFileDialog::getOpenFileName(NULL, "Load a file", "~");
    if (!fileOpen.isEmpty())
    {        StrReplace(fileOpen);
        return Open(fileOpen.toUtf8().constData());
    }
    else
        return false;
}bool IMediaPlayer::OpenURL(const char * url)
{
    return Open(url);
}

之后新建一个派生自IMediaPlayer的类:VlcMediaPlayer,
并使用libvlc实现其基类中的纯虚函数实现视频的播放

/*******************************************************************
VlcMediaPlayer.h
使用libvlc实现的IMediaPlayer
构造时传入QWidget*
调用OpenFile或OpenURL或Open打开文件并渲染窗体
例如:QWidget* pWidget = new QOpenGLWidget();pWidget->show();auto player = new VlcMediaPlayer(pWidget);player->Open("test.hevc");
*******************************************************************/#ifndef VLCMEDIAPLAYER_H
#define VLCMEDIAPLAYER_H#include "IMediaPlayer.h"struct libvlc_media_player_t;
struct libvlc_instance_t;
class VlcMediaPlayer :public IMediaPlayer
{
public:VlcMediaPlayer(QWidget* pWidget);~VlcMediaPlayer();// 禁用拷贝构造和赋值VlcMediaPlayer(const VlcMediaPlayer&) = delete;VlcMediaPlayer& operator=(VlcMediaPlayer&) = delete;// Controlvirtual bool Open(const char* url);virtual bool Play();virtual void Pause();virtual void Stop();virtual void ChangeVolume(int vol) ;private:// 播放器对象libvlc_media_player_t *m_pVlcPlayer;private:// libvlc实例,所有窗体的渲染共用一个static libvlc_instance_t *s_pVlcInstance;static unsigned int s_ref;
};#endif // VLCMEDIAPLAYER_H
/*******************************************************************
VlcMediaPlayer.cpp
libvlc播放视频的实现
*******************************************************************/
#include "VlcMediaPlayer.h"
#include <assert.h>
#include <QtWidgets/QWidget># ifdef __cplusplus
extern "C" {
# endif
#include <vlc/vlc.h>
# ifdef __cplusplus
}
# endif#if defined(Q_OS_MAC)       // Mac
// TODO
#elif defined(Q_OS_UNIX)    // Linux
#pragma comment(lib, "libvlc.a")
#elif defined(Q_OS_WIN)     // Windows
#pragma comment(lib, "libvlc.lib")
#endifunsigned int VlcMediaPlayer::s_ref = 0;
libvlc_instance_t *VlcMediaPlayer::s_pVlcInstance = NULL;VlcMediaPlayer::VlcMediaPlayer(QWidget* pWidget): IMediaPlayer(pWidget), m_pVlcPlayer(NULL)
{/* Initialize libVLC */if (0 == s_ref++){s_pVlcInstance = libvlc_new(0, NULL);if (NULL == s_pVlcInstance){assert(false);}}
}VlcMediaPlayer::~VlcMediaPlayer()
{if (0 == --s_ref){libvlc_release(s_pVlcInstance);}
}bool VlcMediaPlayer::Open(const char *url)
{/* Stop if something is playing */Stop();auto funcOpen = libvlc_media_new_path;if (QString(url).startsWith("rtsp://") ||QString(url).startsWith("rtmp://") ||QString(url).startsWith("rtp://") ||QString(url).startsWith("tcp://") ||QString(url).startsWith("udp://") ||QString(url).startsWith("ftp://") ||QString(url).startsWith("http://") ||QString(url).startsWith("https://")){funcOpen = libvlc_media_new_location;}/* Create a new Media */libvlc_media_t *vlcMedia = funcOpen(s_pVlcInstance, url);/* Fail to open url*/if (!vlcMedia){return false;}if (QString(url).endsWith(".hevc"))libvlc_media_add_option(vlcMedia, ":demux=hevc");else if (QString(url).endsWith("rtsp"))libvlc_media_add_option(vlcMedia, ":rtsp-tcp");/* Create a new libvlc player */m_pVlcPlayer = libvlc_media_player_new_from_media(vlcMedia);/* Release the media */libvlc_media_release(vlcMedia);return Play();
}bool VlcMediaPlayer::Play()
{/* Integrate the video in the interface */
#if defined(Q_OS_MAC)libvlc_media_player_set_nsobject(m_pVlcPlayer, (void*)m_pWidget->winId());
#elif defined(Q_OS_UNIX)libvlc_media_player_set_xwindow(m_pVlcPlayer, m_pWidget->winId());
#elif defined(Q_OS_WIN)libvlc_media_player_set_hwnd(m_pVlcPlayer, (void*)m_pWidget->winId());
#endif/* And start playback */int vlc_ret = libvlc_media_player_play(m_pVlcPlayer);if (0 == vlc_ret)return true;elsereturn false;
}void VlcMediaPlayer::Pause()
{if (m_pVlcPlayer && libvlc_media_player_is_playing(m_pVlcPlayer)){libvlc_media_player_pause(m_pVlcPlayer);}
}void VlcMediaPlayer::Stop()
{if (m_pVlcPlayer){/* stop the media player */libvlc_media_player_stop(m_pVlcPlayer);/* release the media player */libvlc_media_player_release(m_pVlcPlayer);/* Reset application values */m_pVlcPlayer = NULL;}
}void VlcMediaPlayer::ChangeVolume(int vol)
{if (m_pVlcPlayer){libvlc_audio_set_volume(m_pVlcPlayer, vol);}
}

界面部分,
响应界面按钮点击的消息和调整窗体大小的消息,
并且调用VlcMediaPlayer添加播放视频的小窗口

/*******************************************************************
QtPlayer.h
*******************************************************************/
#pragma once#include <QtWidgets/QWidget>
#include "ui_QtPlayer.h"struct libvlc_media_player_t;
class QtPlayer : public QWidget
{
    Q_OBJECT
public:
    QtPlayer(QWidget *parent = Q_NULLPTR);
    void resizeEvent(QResizeEvent* e);private slots:
    void openFile();
    void openURL();private:
    Ui::QtPlayerClass ui;
    QWidget* m_pSubWidgets[16];
};
/*******************************************************************
QtPlayer.cpp
*******************************************************************/
#include "QtPlayer.h"
#include "VlcMediaPlayer.h"QtPlayer::QtPlayer(QWidget *parent): QWidget(parent)
{ui.setupUi(this);memset(m_pSubWidgets, NULL, sizeof(m_pSubWidgets));
}void QtPlayer::openFile()
{int w = width() / 4, h = (height() - 24) / 4;for (int i = 0; i < 16; ++i){if (m_pSubWidgets[i] == NULL){m_pSubWidgets[i] = new QWidget(this);auto player = new VlcMediaPlayer(m_pSubWidgets[i]);// 打开成功if (player->OpenFile()){resizeEvent(NULL);m_pSubWidgets[i]->show();}else{delete player;delete m_pSubWidgets[i];m_pSubWidgets[i] = NULL;}break;}}
}void QtPlayer::resizeEvent(QResizeEvent *e)
{int w = width() / 4, h = (height() - 24) / 4;for (int i = 0; i < 16; ++i){if (NULL == m_pSubWidgets[i])continue;m_pSubWidgets[i]->resize(QSize(w, h));m_pSubWidgets[i]->move(QPoint((i % 4) * w, (i / 4) * h));}QPoint pos = ui.btnOpenFile->pos();pos.setY(height() - 24);ui.btnOpenFile->move(pos);pos = ui.btnOpenURL->pos();pos.setY(height() - 24);ui.btnOpenURL->move(pos);pos = ui.lineEdit->pos();pos.setY(height() - 24);ui.lineEdit->move(pos);
}void QtPlayer::openURL()
{int w = width() / 4, h = height() / 4;for (int i = 0; i < 16; ++i){if (m_pSubWidgets[i] == NULL){m_pSubWidgets[i] = new QWidget(this);auto player = new VlcMediaPlayer(m_pSubWidgets[i]);// 打开成功if (player->OpenURL(ui.lineEdit->text().toUtf8().constData())){resizeEvent(NULL);m_pSubWidgets[i]->show();}else{delete player;delete m_pSubWidgets[i];m_pSubWidgets[i] = NULL;}break;}}
}

简单的多屏播放器示例(vlc+qt)相关推荐

  1. android带投屏播放器,手机投屏播放器软件下载-投屏播放器 安卓版v2.4.6-PC6安卓网...

    手机投屏播放器软件是一款非常不错的投屏神器,使用投屏播放器app用户可以将手机上的视频投放在光滑的墙面上,投屏播放器app也能投放到Tv上,设置方法非常简单,喜欢的玩家不要错过,欢迎下载! 软件介绍 ...

  2. python播放网络音乐_Python实现在线音乐播放器示例

    这篇文章主要为大家详细介绍了Python实现在线音乐播放器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目 ...

  3. 使用java创建一个简易的视屏播放器

    最近有个多媒体的作业,要求使用visualC++和opencv编写一个简易的视屏播放器,对于C/C++残疾者而言是不可能的,于是萌生了用java编写的想法.具体经验分享一下. 目标:制作简易视屏播放器 ...

  4. Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)(转载)

    转载自:<Android 实现视屏播放器.边播边缓存功能.外加铲屎(IJKPlayer)> hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖 ...

  5. java 生成media_使用java创建一个简易的视屏播放器

    最近有个多媒体的作业,要求使用visualC++和opencv编写一个简易的视屏播放器,对于C/C++残疾者而言是不可能的,于是萌生了用java编写的想法.具体经验分享一下. 目标:制作简易视屏播放器 ...

  6. 一款简单的本地音乐播放器,界面美观、包括主题切换、歌单管理等等

    MeetMusic 项目地址:lijunyandev/MeetMusic  简介:一款简单的本地音乐播放器,界面美观.包括主题切换.歌单管理等等 音乐-播放器-主题切换- App 效果图        ...

  7. python开发音乐播放器教程_python开发简易版在线音乐播放器示例代码

    在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...

  8. C#制作简单的本地音乐播放器(二)—— 显示歌词

    此篇文章主要补充 C#制作简单的本地音乐播放器(一) 中的"歌词显示"部分的内容. 页面设计部分 相关内容 本程序使用的歌词文件为lrc格式,lrc是英文lyric(歌词)的缩写, ...

  9. 【190115】一个简单的P2P网络播放器,可自动搜索资源源代码

    源码下载简介 一个简单的P2P网络播放器,可自动搜索资源,可手动控制播放,自动获取媒体文件的属性信息,比如标题.艺术家.演唱者.出版年份.专辑等. 源码下载地址:点击下载 备用下载地址:点击下载

最新文章

  1. 网站性能越来越差怎么办?
  2. 河南城建学院linux期末试题,河南城建学院09-10(上)期末试题.ppt
  3. Spring+Quartz实现定时任务的配置方法
  4. distinct和group by不能一起用_内裤用热水洗更好吗?能不能和袜子一起洗?了解后炎症或能少困扰...
  5. SQLserver查看某个视图的创建语句
  6. php转字,php汉字如何转数字
  7. IOS 8.0 适配应用图片设计
  8. 搜狗快速排名软件到底哪家更强大?
  9. 日式餐饮主题PPT模板
  10. windows环境下neo4j下载安装配置
  11. win10使用软件提示“为了对电脑进行保护,已经阻止此应用”或软件上面有盾牌不能正常打开软件。
  12. JavaScript打开关闭窗口事件
  13. 人工智能与商业智能,区别、定位与联系
  14. 芝诺数解|「十三」一菜一格,百菜百味——重庆川菜数据分析报告
  15. 离开腾讯首创业,贾佳亚谈人工智能 2.0 革命,技术究竟该如何变革?
  16. 电机控制器培训资料-《如何快准狠的标定永磁同步电机》 品牌:车用电机控制器
  17. CloseableHttpClient设置Timeout 设置超时时间
  18. 和数集团董事长唐毅先生受邀出席“文旅产业与数字艺术新形态”高峰文化论坛
  19. 未来几年中,软件测试的几大趋势是什么?
  20. 分享一些优秀的思维导图作品

热门文章

  1. html+js+css 调用jquery 工人信息管理功能(增删改查)前端实现,以及调用实现鼠标拖尾粒子效果的js库
  2. 爱立信实验室实习感想(二)
  3. 关卡一: jQuery编程
  4. 深圳软件测试培训:DOM中元素节点、属性节点、文本节点的理解
  5. 汉语是思维广阔敏捷的语言
  6. SSD 闪存颗粒详解
  7. ITOP4412 RFID RC522模块
  8. C++STL标准库学习笔记(一)sort
  9. LabVIEW中ActiveX控件、ActiveX服务器和类型库注册
  10. 交互式SQL(Transact SQL,TSQL)