天天看點

C++黑客程式設計:視訊播放器的開發

有一年多沒寫了,挺對不起大家。

我是用MFC寫的,2021年用MFC是不是有一點可笑

廢話不多說,上項目展示圖:

C++黑客程式設計:視訊播放器的開發

我用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上編譯成功,大家多多支援,在時間處理上,我沒有處理小時的轉換,大家有興趣的可以嘗試着去修改。

使用方法就是把視訊檔案拖放在程式上

繼續閱讀