1. 程式人生 > >一個最簡單的VLC播放器的實現—MFC

一個最簡單的VLC播放器的實現—MFC

實現了一個最簡單的播放器功能,能夠進行視訊的播放和暫停。
搭建好了一個基本的“類”框架,只需要在“類”中編寫相應的功能函式就可以繼續開發其他功能。

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視窗不夠美觀

期待後續改進: