实现了一个最简单的播放器功能,能够进行视频的播放和暂停。
搭建好了一个基本的“类”框架,只需要在“类”中编写相应的功能函数就可以继续开发其他功能。
1.环境配置:
新建一个MyPlayer项目,将VLC打包环境中的Debug、include、lib文件夹复制到项目中,在新建的项目上点击右键->属性,在包含目录和库目录中分别添加include和lib。
2.部分功能介绍:
2.1 实现媒体文件拖拽功能:
新建一个List Box 插件,将Acccept Files 项设置为true
在MyPlayerDlg.h中添加代码:
//拖放文件函数的声明
void CMyPlayerDlg::OnDropFiles(HDROP hdropinfo);
//声明一个类变量
CListBox m_LIST_Play;
在MyPlayerDlg.cpp中添加代码:
//响应拖放文件的消息
ON_WM_DROPFILES()
//拖放文件函数
void CMyPlayerDlg::OnDropFiles(HDROP hdropinfo){
wchar_t szfilepath[MAX_PATH] = { 0 };
UINT nfilecount = DragQueryFile(hdropinfo, -1, nullptr, 0);
for (UINT temp = 0; temp < nfilecount; temp++){
DragQueryFile(hdropinfo, temp, szfilepath, MAX_PATH);
m_LIST_Play.AddString(szfilepath);
}
CDialogEx::OnDropFiles(hdropinfo);
}
2.2添加一个新Player”类”,实现播放和暂停功能:
“类”声明如下:
//播放类
#pragma once
struct libvlc_media_player_t;
struct libvlc_instance_t;
struct libvlc_media_t;
class CPlayer
{
public:
/*
*默认构造类
*/
CPlayer();
/*
*默认析构类
*/
~CPlayer();
/*
*播放指定路径的视频
*/
bool play(char *szfilepath, HWND hwnd);
bool pause();
private:
libvlc_media_player_t *pVlcPlayer;
libvlc_instance_t *pVlcInstance;
libvlc_media_t *pVlcMedia;
HWND m_hwnd;
};
定义如下:
//播放类基于VLC功能的实现
#include "stdafx.h"
#include "Player.h"
#include "vlc.h"
//包含VLC动态库
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")
//构造函数,初始化数据
CPlayer::CPlayer()
{
pVlcPlayer = nullptr;
pVlcInstance = nullptr;
pVlcMedia = nullptr;
m_hwnd = nullptr;
}
//析构函数
CPlayer::~CPlayer()
{
}
//视频播放函数,播放一个指定目录的文件
bool CPlayer::play(char *szfilepath,HWND hwnd ){
bool bRet = false;
m_hwnd = hwnd;
do{
if (0 == strlen(szfilepath)){
break;
}
//VLC的实例初始化
if (!pVlcInstance){
pVlcInstance = libvlc_new(0, nullptr);
}
//VLC的媒体实例
pVlcMedia = libvlc_media_new_path(pVlcInstance, szfilepath);
// 对应一个指定的视频
pVlcPlayer = libvlc_media_player_new_from_media(pVlcMedia);
//设置一个播放窗口
libvlc_media_player_set_hwnd(pVlcPlayer, m_hwnd);
//通过媒体实例开始播放
libvlc_media_player_play(pVlcPlayer);
bRet = true;
}while (false);
if (pVlcMedia)
{
libvlc_media_release(pVlcMedia);
}
return bRet;
}
//视频暂停函数
bool CPlayer::pause(){
bool b_ret = false;
do{
if (pVlcPlayer){
if (libvlc_media_player_can_pause(pVlcPlayer)){
libvlc_media_player_pause(pVlcPlayer);
}
b_ret = true;
}
} while (false);
return b_ret;
}
2.3添加一个按钮,控制视频的播放和暂停
首先在CMyPlayerDlg类中添加两个变量
CPlayer *player;
bool isplay=false;
然后在MyPlayerDlg.cpp中添加按钮的功能代码:
void CMyPlayerDlg::OnBnClickedButtonPlay()
{
// TODO: 在此添加控件通知处理程序代码
CString str_buffer;
//得到按钮的文本内容
GetDlgItemText(IDC_BUTTON_PLAY, str_buffer);
if (L"播放" == str_buffer){
//判断是否第一次播放
if (!isplay){
wchar_t szpath[MAX_PATH] = { 0 };
//得到选中文件的标号
int ndex = m_LIST_Play.GetCurSel();
//得到选中文件的地址值
m_LIST_Play.GetText(ndex, szpath);
//判断是否选中文件
if (ndex != -1){
if (!player){
player = new CPlayer;
}
//播放
player->play(CW2A(szpath), GetDlgItem(IDC_STATIC_PLAY)->GetSafeHwnd());//CW2A 只能在WINDOWS下使用,一行代码只能出现一个
SetDlgItemText(IDC_BUTTON_PLAY, L"暂停");
isplay = true;
}
}
//pause函数如果视频在播放,点击暂停,如果视频暂停,则点击播放
else{
player->pause();
SetDlgItemText(IDC_BUTTON_PLAY, L"暂停");
}
}
else{
player->pause();
SetDlgItemText(IDC_BUTTON_PLAY, L"播放");
}
}
本程序实现了一个最简单的播放器框架,还存在许多问题:
“类”框架不够完善,VLC的初始化,hWnd的设置等都没做。
播放器的好多功能都没有实现
MFC窗口不够美观
期待后续改进: