有一年多沒寫了,挺對不起大家。
我是用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上編譯成功,大家多多支援,在時間處理上,我沒有處理小時的轉換,大家有興趣的可以嘗試着去修改。
使用方法就是把視訊檔案拖放在程式上