一個最簡單的VLC播放器的實現—MFC
阿新 • • 發佈:2019-01-08
實現了一個最簡單的播放器功能,能夠進行視訊的播放和暫停。
搭建好了一個基本的“類”框架,只需要在“類”中編寫相應的功能函式就可以繼續開發其他功能。
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視窗不夠美觀
期待後續改進: