一个最简单的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窗口不够美观

期待后续改进:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值