有一年多没写了,挺对不起大家。
我是用MFC写的,2021年用MFC是不是有一点可笑
废话不多说,上项目展示图:
我用VLC的库做的,大家可以在官网下载,我有一个百度网盘链接:
**链接:https://pan.baidu.com/s/1ncgZC4mj35koQiJ5CVpZQg
提取码:6666
**
下载好了后,有一个叫“vlc”的文件夹,放在“xxx.sin”同目录,打开VS,配置lib,include文件,优快云有很多教程,不懂得可以去搜
!!!把库文件都配置好了后,介绍库的几个函数
libvlc_media_player_stop:停止播放
libvlc_media_player_set_pause:暂停或继续
libvlc_media_player_set_time:设置播放时间
libvlc_media_player_get_time:获取播放时间
详细的大家可以去官网查资料
主对话框的控件:
1.EDIT控件,就是那个输入框,用来表示播放时间,ID为IDC_EDIT1;
2.进度条,变量m_slider,ID为IDC_SLIDER1;
3.暂停按钮,ID为IDC_BTN_PAUSE;
1.打开VS,新建一个MFC项目,叫“MyPlayer”
2.配置VLC库
3.删去无用的代码,对话框等。添加一个对话框,并添加一个对话框类与之关联,这个对话框用来播放视频,类叫做“showdlg”
4.新建一个头文件,一个源文件,“play.h” “play.cpp”
这个是play.cpp
#include "Play.h"
#include "pch.h"
CPlay::CPlay() :
m_pVlc_Inst(NULL), m_pVlc_media(NULL), m_pVlc_Player(NULL)
{
}
CPlay::~CPlay()
{
}
void CPlay::Init()
{
if (m_pVlc_Inst == NULL)
m_pVlc_Inst = libvlc_new(0, NULL);
}
void CPlay::Close()
{
libvlc_media_player_stop(m_pVlc_Player);
}
void CPlay::Pause()
{
libvlc_media_player_set_pause(m_pVlc_Player, 1);
}
void CPlay::Continue()
{
libvlc_media_player_set_pause(m_pVlc_Player, 0);
}
BOOL CPlay::Play(char* szVedio,HWND hWnd)
{
Init();
if (szVedio == NULL || strlen(szVedio) == 0)
return FALSE;
m_pVlc_media = libvlc_media_new_path(m_pVlc_Inst, szVedio);
m_pVlc_Player = libvlc_media_player_new_from_media(m_pVlc_media);
libvlc_media_release(m_pVlc_media);
libvlc_media_player_play(m_pVlc_Player);
libvlc_media_player_set_hwnd(m_pVlc_Player, hWnd);
return TRUE;
}
libvlc_time_t CPlay::GetLength()
{
libvlc_media_parse(m_pVlc_media);
return libvlc_media_get_duration(m_pVlc_media);
}
libvlc_time_t CPlay::GetCurrentPos()
{
return libvlc_media_player_get_time(m_pVlc_Player);
}
void CPlay::MySetPos(float pos)
{
libvlc_media_player_set_time(m_pVlc_Player, pos);
}
这个是play.h
#ifndef _PLAY_H
#define _PLAY_H
#include <vlc\vlc.h>
class CPlay
{
public:
libvlc_instance_t* m_pVlc_Inst;
libvlc_media_player_t* m_pVlc_Player;
libvlc_media_t* m_pVlc_media;
public:
CPlay();
~CPlay();
void Init();
void Close();
void Pause();
void Continue();
void MySetPos(float pos);
BOOL Play(char* szVedio, HWND hWnd);
libvlc_time_t GetLength();
libvlc_time_t GetCurrentPos();
};
#endif
这个是MyPlayerDlg.h的变量
afx_msg void OnDropFiles(HDROP hDropInfo);
CPlay m_video;
BOOL m_bPlayState;//暂停的标识
BOOL m_start;
afx_msg void OnBnClickedBtnPause();
CSliderCtrl m_slider;
afx_msg void OnTimer(UINT_PTR nIDEvent);
CShowDlg* show = NULL;
void MySetStatic();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
这个是MyPlayerDlg.cpp的实现
CMyPlayerDlg::CMyPlayerDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MYPLAYER_DIALOG, pParent)
{
m_bPlayState = FALSE;
m_start = FALSE;
}
void CMyPlayerDlg::OnDropFiles(HDROP hDropInfo)
{
UINT nCount=DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,NULL);
TCHAR szVideoPath[MAX_PATH];
DragQueryFile(hDropInfo, nCount-1, szVideoPath, MAX_PATH);
wchar_t* b = new wchar_t[strlen(szVideoPath)];
memset(b, 0, strlen(szVideoPath) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, szVideoPath, strlen(szVideoPath),b, strlen(szVideoPath)*sizeof(wchar_t));
char* c = new char[wcslen(b) * 2];
memset(c, 0, wcslen(b) * 2);
WideCharToMultiByte(CP_UTF8, 0, b, wcslen(b), c, wcslen(b) * 2, NULL, NULL);
CString strFilePath;
strFilePath.Format("您打开的文件是%s,是否打开?", szVideoPath);
if (MessageBox(strFilePath, "提示", MB_YESNO| MB_ICONQUESTION) == IDYES)
{
CString str;
str.Format("当前播放视频为:%s", szVideoPath);
SetDlgItemText(IDC_STATIC3, str);
if (!show)
{
show = new CShowDlg;
show->Create(IDD_DIALOG1, this);
}
show->ShowWindow(SW_SHOW);
show->SetActiveWindow();
m_video.Play(c,show->m_hWnd);
int VedioLength= m_video.GetLength();
m_slider.SetRange(0, VedioLength);
SetTimer(1, 200, NULL);
m_start = TRUE;
m_bPlayState = TRUE;
}
delete[]c;
delete[]b;
CDialogEx::OnDropFiles(hDropInfo);
}
void CMyPlayerDlg::OnBnClickedBtnPause()
{
if (m_start == FALSE)
{
MessageBox("请您拖放文件", "提示", MB_OK | MB_ICONERROR);
return;
}
if (m_bPlayState == TRUE)
{
m_video.Pause();
SetDlgItemText(IDC_BTN_PAUSE, "播放");
m_bPlayState = FALSE;
}
else
{
m_video.Continue();
SetDlgItemText(IDC_BTN_PAUSE, "暂停");
m_bPlayState = TRUE;
}
}
void CMyPlayerDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
{
int nPos = m_video.GetCurrentPos();
CString strPos;
int hour = 0;
int minute = 0;
int second = nPos / 1000;
strPos.Format("%d:%d:%d", hour, minute, second);
m_slider.SetPos(nPos);
SetDlgItemText(IDC_EDIT1,strPos );
if (second >= 60)
{
minute = second/60;
second = second -(60*minute);
strPos.Format("%d:%d:%d", hour, minute, second);
SetDlgItemText(IDC_EDIT1, strPos);
}
}
}
CDialogEx::OnTimer(nIDEvent);
}
void CMyPlayerDlg::MySetStatic()
{
SetDlgItemText(IDC_STATIC3, "当前播放视频为:无");
m_start = FALSE;
}
void CMyPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (m_start == TRUE)
{
m_video.MySetPos((float)m_slider.GetPos());
}
else if (m_start == FALSE)
{
MessageBox("请您拖放文件", "提示", MB_OK | MB_ICONERROR);
return;
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
这个是ShowDlg.cpp的关闭消息函数,我重载了一下
void CShowDlg::OnClose()
{
CDialogEx::OnClose();
CMyPlayerDlg* str = (CMyPlayerDlg*)AfxGetMainWnd();
str->MySetStatic();
str->m_video.Close();
str = NULL;
}
在vs2019上编译成功,大家多多支持,在时间处理上,我没有处理小时的转换,大家有兴趣的可以尝试着去修改。
使用方法就是把视频文件拖放在程序上