C++黑客编程:视频播放器的开发

有一年多没写了,挺对不起大家。

我是用MFC写的,2021年用MFC是不是有一点可笑

废话不多说,上项目展示图:
我用VLC的库做的,大家可以在官网下载,我有一个百度网盘链接:
**链接:https://pan.baidu.com/s/1ncgZC4mj35koQiJ5CVpZQg
提取码:6666
**

下载好了后,有一个叫“vlc”的文件夹,放在“xxx.sin”同目录,打开VS,配置lib,include文件,CSDN有很多教程,不懂得可以去搜

!!!把库文件都配置好了后,介绍库的几个函数

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上编译成功,大家多多支持,在时间处理上,我没有处理小时的转换,大家有兴趣的可以尝试着去修改。
使用方法就是把视频文件拖放在程序上

猜你喜欢

转载自blog.csdn.net/m0_47563648/article/details/118890822