亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ericmediacontrol.cpp

?? 一個wince版的播放器 采用directx技術,可以下載參考一下 支持mobile 5 6
?? CPP
字號:
/*-----------------------------------------
* Copyright (c) 2008 Eric Wong
* 本版緊供讀者參考,不得用于任何商業行為
*
* 文件名稱: EricMediaControl.cpp
* 文件標識: 
* 摘要:用于封裝DSHOW 播放視頻文件
*
* 當前版本: 1.0
* 作者: 汪兵 Eric Wong
* 完成日期: 2008年2月2日
*
* 取代版本:
* 原作者: 
* 完成日期: 
----------------------------------------*/
#include "StdAfx.h"
#include "EricMediaControl.h"

//構造函數
CEricMediaControl::CEricMediaControl(void)
{
	//將DSHOW接口置空
	m_pGB = NULL;
	m_pMC = NULL;
	m_pME = NULL;
	m_pVW = NULL;
	m_pBA = NULL;
	m_pBV = NULL;
	m_pMS = NULL;
	//初始化 COM 環境
	CoInitialize(NULL); 
}

//析構函數
CEricMediaControl::~CEricMediaControl(void)
{
	//釋放DSHOW接口
	UnInitDShow();
	//釋放COM 環境
	CoUninitialize();
}


/*
*函數介紹: 初始化DShow接口,并渲染好視頻文件
*入口參數: strFileName:	視頻文件名
			hOwnerWnd:		顯示視頻的窗口句柄
			hNotifyWnd:		接收DSHOW事件消息的串口句柄
*出口參數:(無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::InitDShow(LPCTSTR strFileName  /*視頻文件名*/
		,HWND hOwnerWnd  /*顯示視頻的窗口句柄*/
		,HWND hNotifyWnd /*接收DSHOW事件消息的串口句柄*/
		)
{
	HRESULT hResult;
	//第1步:創建IGraphBuilder接口
	hResult = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGB);
	if (hResult != S_OK)
	{
		return FALSE;
	}
	//第2步:利用IGraphBuilder渲染視頻文件
	hResult = m_pGB->RenderFile(strFileName,NULL);
	if (hResult != S_OK )
	{
		//
		if (hResult == VFW_S_PARTIAL_RENDER)
		{
			TRACE(L"Some of the streams in this movie are in an unsupported format.\n");			
		}
		else if (hResult == VFW_S_AUDIO_NOT_RENDERED)
		{
			TRACE(L"Partial success; the audio was not rendered.\n");		
		}
		else if (hResult == VFW_S_DUPLICATE_NAME)
		{
			TRACE(L"Success; the Filter Graph Manager modified the filter name to avoid duplication..\n");	
		}
		else if (hResult == VFW_S_VIDEO_NOT_RENDERED)
		{
			TRACE(L"Partial success; some of the streams in this movie are in an unsupported format.\n");
		}
		else
		{
			//釋放DSHOW接口
			UnInitDShow();
			return FALSE;
		}
	}
	//第3步:得到媒體播放控制接口
	hResult = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC); 
	if (hResult != S_OK)
	{
		//釋放DSHOW接口
		UnInitDShow();
		return FALSE;
	}
	//第4步:得到媒體播放位置搜索接口
	hResult = m_pGB->QueryInterface(IID_IMediaSeeking,(void**)&m_pMS);
	if (hResult != S_OK)
	{
		//釋放DSHOW接口
		UnInitDShow();
		return FALSE;
	}
	
	//設置查找定位的時間單位,這里設置:100納秒(十億分之一秒)
	GUID guid_timeFormat = TIME_FORMAT_MEDIA_TIME;
	m_pMS->SetTimeFormat(&guid_timeFormat);

	//第5步:得到Filter Graph媒體事件接口
	hResult = m_pGB->QueryInterface(IID_IMediaEventEx,(void**)&m_pME);
	if (hResult != S_OK)
	{
		//釋放DSHOW接口
		UnInitDShow();
		return FALSE;
	}
	//設置媒體事件通知消息窗口
	m_pME->SetNotifyWindow((OAHWND)hNotifyWnd, WM_GRAPHNOTIFY, 0);

	//第6步:得到視頻播放窗口接口
	 hResult = m_pGB->QueryInterface(IID_IVideoWindow, (void **)&m_pVW);
	 if (hResult != S_OK)
	 {
		//釋放DSHOW接口
		UnInitDShow();
		return FALSE;
	 }
	 //設置視頻播放窗口句柄
	 m_pVW->put_Owner((OAHWND)hOwnerWnd);
	 //設置視頻窗口格式
     m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

	 //第7步:得到基礎視頻流接口
	 hResult = m_pGB->QueryInterface(IID_IBasicVideo, (void **)&m_pBV);
  	 if (hResult != S_OK)
	 {
		//釋放DSHOW接口
		UnInitDShow();
		return FALSE;
	 }

	 //第8步:得到基礎音頻流接口
	 hResult = m_pGB->QueryInterface(IID_IBasicAudio, (void **)&m_pBA);
  	 if (hResult != S_OK)
	 {
		//釋放DSHOW接口
		UnInitDShow();
		return FALSE;
	 }

	return TRUE;
}


/*
*函數介紹: 卸載DShow系列接口
*入口參數: (無)
*出口參數:(無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::UnInitDShow()
{
	//1,釋放媒體播放控制接口
	if (m_pMC != NULL)
	{
		//停止視頻播放
		m_pMC->Stop(); 
		m_pMC->Release();
		m_pMC = NULL;
	}
	
	//2,釋放媒體事件接口
	if (m_pME != NULL)
	{
		//消息通知窗口置空
		m_pME->SetNotifyWindow(NULL, 0, 0);
		m_pME->Release();
		m_pME = NULL;
	}

	//3,釋放視頻播放窗口接口
	if (m_pVW != NULL)
	{
		//隱藏視頻窗口
		m_pVW->put_Visible(OAFALSE);
		//設置視頻播放窗口句柄為空
		m_pVW->put_Owner(NULL);
		m_pVW->Release();
		m_pVW = NULL;
	}

	//4,釋放基礎音頻流接口
	if (m_pBA != NULL)
	{
		m_pBA->Release();
		m_pBA = NULL;
	}

	//5,釋放基礎視頻流接口
	if (m_pBV != NULL)
	{
		m_pBV->Release();
		m_pBV = NULL;
	}

	//6,釋放媒體搜索接口
	if (m_pMS != NULL)
	{
		m_pMS->Release();
		m_pMS = NULL;
	}

	//7,最后釋放FilterGpaph接口
	if (m_pGB != NULL)
	{
		m_pGB->Release();
		m_pGB = NULL;
	}

	return TRUE;
}

/*
*函數介紹:打開視頻文件
*入口參數: strFileName:	視頻文件名
			hOwnerWnd:		顯示視頻的窗口句柄
			hNotifyWnd:		接收DSHOW事件消息的串口句柄
*出口參數:(無)
*返回值:TRUE:成功打開視頻文件;FALSE:打開視頻文件失敗
*/
BOOL CEricMediaControl::OpenFile(LPCTSTR strFileName /*視頻文件名*/
		,HWND hOwnerWnd  /*顯示視頻的窗口句柄*/
		,HWND hNotifyWnd /*接收DSHOW事件消息的串口句柄*/
		)
{
	//存儲顯示視頻窗口句柄
	m_hOwnerWnd = hOwnerWnd;

	//重置DSHOW接口
	UnInitDShow();

	//打開視頻文件,并對DSHOW接口做初始化工作
	return InitDShow(strFileName,hOwnerWnd,hNotifyWnd);
}

/*
*函數介紹:播放視頻
*入口參數:(無)
*出口參數:(無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::VideoRun()
{
	//檢測IMediaControl控制接口有效性
	if (m_pMC == NULL)
	{
		return FALSE;
	}
	
	//播放視頻
	HRESULT hResult = m_pMC->Run();
	if (hResult != S_OK)
	{
		return FALSE;
	}
	return TRUE;

}

/*
*函數介紹:暫停視頻
*入口參數:(無)
*出口參數:(無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::VideoPause()
{
	//檢測IMediaControl控制接口有效性
	if (m_pMC == NULL)
	{
		return FALSE;
	}

	//暫停視頻
	HRESULT	hResult = m_pMC->Pause();
	if (hResult != S_OK)
	{
		return FALSE;
	}

	return TRUE;
}

/*
*函數介紹:停止視頻
*入口參數:(無)
*出口參數:(無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::VideoStop()
{
	HRESULT hResult	;
	//檢測IMediaControl控制接口有效性
	if (m_pMC == NULL)
	{
		return FALSE;
	}
	
	//停止視頻
	hResult = m_pMC->Stop();
	if (hResult != S_OK)
	{
		return FALSE;
	}

	//將當前播放位置置0
    LONGLONG pos=0;
	hResult = m_pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
                                   NULL, AM_SEEKING_NoPositioning);

	return TRUE;
}


/*
*函數介紹:  設置視頻顯示比例
*入口參數:  fScale : 顯示比例, <= 1.0
*出口參數: (無)
*返回值:TRUE:成功;FALSE:失敗,此處有點問題
*/
BOOL CEricMediaControl::FitVideoWindow(FLOAT fScale)
{
    LONG lHeight, lWidth;
	int iSeek = 0;
	double dblScaleX,dblScaleY;
    HRESULT hr = S_OK;
	LONG lDeflateX = 0;
	LONG lDeflateY = 0;
    CRect clientRect;
	CRect dstRect;
	
	//
	if (m_pBV == NULL)
	{
		return FALSE;
	}
	
	//放縮比例必須小于等于1
	if (fScale > 1.0)
	{
		return FALSE;
	}

	//得到原始視頻尺寸
    hr = m_pBV->GetVideoSize(&lWidth, &lHeight);
	if (hr != S_OK)
	{
		return FALSE;
	}

	//設置拉伸后的尺寸
	lWidth = lWidth * fScale;
	lHeight = lHeight * fScale;

	//得到視頻播放窗口的尺寸
	GetClientRect(m_hOwnerWnd, &clientRect);

	lDeflateX = (clientRect.Width() - clientRect.Width() * fScale) / 2;
	lDeflateY = (clientRect.Height() - clientRect.Height() * fScale) / 2;

	//重新設置客戶區域
	clientRect.DeflateRect(lDeflateX,lDeflateY);

    
	if ( (lWidth <= clientRect.Width())
		&& (lHeight <= clientRect.Height()))
	{
		dstRect.left = (clientRect.right - clientRect.left - lWidth) /2;
		dstRect.right = dstRect.left + lWidth;
		dstRect.top  = (clientRect.bottom - clientRect.top - lHeight) /2;
		dstRect.bottom = dstRect.top + lHeight;
	}
	else 
	{
		dblScaleX =double(clientRect.Width()) / double(lWidth) ;
		dblScaleY =  double(clientRect.Height()) / double(lHeight) ;
		
		if (dblScaleX <= dblScaleY)
		{
			dstRect.left = clientRect.left;
			dstRect.right = clientRect.right;

			iSeek =(clientRect.Height() - clientRect.Width()*(double(lHeight) / double(lWidth)))/2;
			dstRect.top = clientRect.top + iSeek;
			dstRect.bottom = dstRect.top + clientRect.Width()*(double(lHeight) / double(lWidth));
		}
		else
		{
			dstRect.top = clientRect.top;
			dstRect.bottom = clientRect.bottom;

			iSeek =(clientRect.Width() - clientRect.Height()*(double(lWidth) / double(lHeight)))/2;
			dstRect.left = clientRect.left + iSeek;
			dstRect.right = dstRect.left + clientRect.Height()*(double(lWidth) / double(lHeight));
		}
	}

	//設置視頻播放位置
    m_pVW->SetWindowPosition(dstRect.left,dstRect.top,dstRect.Width(),dstRect.Height());

    return TRUE;
}

/*
*函數介紹:  全屏顯示
*入口參數: (無)
*出口參數: (無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::FullScreen()
{
	LONG lMode = 0;
	static HWND hDrain=0;
	if (m_pBV == NULL)
	{
		return FALSE;
	}
	//得到全屏狀態
	m_pVW->get_FullScreenMode(&lMode);
	
	if (lMode == OAFALSE)
    {
		// Save current message drain
        m_pVW->get_MessageDrain((OAHWND *) &hDrain);

        // Set message drain to application main window
        m_pVW->put_MessageDrain((OAHWND)m_hOwnerWnd );
		
		//設置全屏幕
        lMode = OATRUE;
        m_pVW->put_FullScreenMode(lMode);
    }
    else
    {
        //切換到非全屏模式
        lMode = OAFALSE;
        m_pVW->put_FullScreenMode(lMode);

		 // Undo change of message drain
        m_pVW->put_MessageDrain((OAHWND) hDrain);
        // Reset video window
        FitVideoWindow(1);
        m_pVW->SetWindowForeground(-1);
	}
	return TRUE;
}

/*
*函數介紹:  得到是否全屏幕播放
*入口參數: (無)
*出口參數: (無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::GetFullScreenStatus()
{
	LONG lMode = 0;
	if (m_pBV == NULL)
	{
		return FALSE;
	}

	m_pVW->get_FullScreenMode(&lMode);

	if (lMode == OAFALSE)
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

/*
*函數介紹:  得到媒體事件
*入口參數: (無)
*出口參數: lEventCode
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::GetMediaEvent(long *lEventCode)
{
    LONG evCode, evParam1, evParam2;
    HRESULT hr=S_OK;

	if (m_pME == NULL)
	{
		return FALSE;
	}

	hr = m_pME->GetEvent(&evCode, &evParam1, &evParam2, 0);
    if (SUCCEEDED(hr))
	{
        *lEventCode = evCode;
		// Spin through the events
        hr = m_pME->FreeEventParams(evCode, evParam1, evParam2);
		
		return TRUE;
	}
	return FALSE;
}


/*
*函數介紹:  設置播放進度
*入口參數: dwPos :播放進度,單位秒
*出口參數: (無)
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::SetPositions(DWORD dwPos /*設置當前播放進度*/)
{
	//設置絕對位置,轉化成納秒為單位
	LONGLONG llPos = dwPos * 10000 * 1000;
	if (m_pMS == NULL)
	{
		return FALSE;
	}
	//設置視頻播放當前位置
	HRESULT hr = m_pMS->SetPositions(&llPos,AM_SEEKING_AbsolutePositioning ,
                                   NULL, AM_SEEKING_NoPositioning);
	if (hr == S_OK)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/*
*函數介紹:  得到視頻文件播放長度,單位秒
*入口參數: dwLength :視頻文件時間長度
*出口參數: dwLength :視頻文件時間長度
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::GetDuration(DWORD &dwLength)
{	
	dwLength = 0;
	if (m_pMS == NULL)
	{
		return FALSE;
	}

	//得到視頻總時間長度
	LONGLONG llDuration;
	HRESULT hResult = m_pMS->GetDuration(&llDuration);
	if (hResult != S_OK)
	{
		return FALSE;
	}

	//轉換成以秒為單位
	llDuration = llDuration / 10000 ;
	llDuration = llDuration / 1000;
	dwLength  = (DWORD)llDuration;
	return TRUE;
}

/*
*函數介紹:  得到媒體當前播放進度位置,單位秒
*入口參數: dwPos :當前播放進度,單位秒
*出口參數: dwPos :當前播放進度,單位秒
*返回值:TRUE:成功;FALSE:失敗
*/
BOOL CEricMediaControl::GetCurrentPos(DWORD &dwPos)
{
	dwPos = 0;
	LONGLONG llPos = 0;
	if (m_pMS== NULL)
	{
		return FALSE;
	}
	
	//得到當前視頻播放位置
	HRESULT hResult = m_pMS->GetCurrentPosition(&llPos);
	if (hResult != S_OK)
	{
		return FALSE;
	}

	//轉換成以秒為單位
	llPos = llPos / 10000 ;
	llPos = llPos / 1000;
	dwPos  = (DWORD)llPos;
	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩理论片一区二区| 欧美一级生活片| 国产精品久久久久久久久免费樱桃 | 奇米四色…亚洲| 精品三级av在线| 国产99久久久国产精品免费看| 亚洲国产精品精华液ab| 99视频超级精品| 亚洲成在人线免费| 日韩视频不卡中文| 国产精品18久久久久| 亚洲欧美自拍偷拍| 欧美丰满高潮xxxx喷水动漫| 免费成人美女在线观看.| 久久久欧美精品sm网站| 北岛玲一区二区三区四区| 一区二区三区在线观看视频| 欧美日韩在线播| 狠狠色2019综合网| 亚洲色图在线播放| 日韩欧美不卡一区| 成人免费看黄yyy456| 亚洲一区二区三区爽爽爽爽爽| 91精品在线观看入口| 国产91精品久久久久久久网曝门 | 欧美日韩一级视频| 国产九色sp调教91| 一区二区欧美国产| 久久精品无码一区二区三区| 91丝袜美腿高跟国产极品老师| 亚洲成人自拍一区| 国产精品天干天干在线综合| 欧美日韩国产系列| 成人性生交大片免费| 日本不卡高清视频| 亚洲女厕所小便bbb| 欧美成人高清电影在线| 色屁屁一区二区| 国产一区二区三区在线观看免费视频 | 懂色av一区二区三区免费看| 天堂久久一区二区三区| 亚洲欧美自拍偷拍| 久久嫩草精品久久久久| 欧美三级电影网站| 成人黄色综合网站| 精品一二三四区| 视频一区欧美日韩| 亚洲卡通动漫在线| 国产精品女主播av| 日韩欧美国产午夜精品| 欧美日韩视频在线观看一区二区三区 | 日韩写真欧美这视频| 色婷婷久久综合| 成人av电影免费观看| 国产综合成人久久大片91| 亚洲成人激情综合网| 亚洲欧美日韩国产成人精品影院| 久久久午夜精品| 日韩欧美色综合网站| 欧美午夜在线一二页| 色播五月激情综合网| 99综合电影在线视频| 国产成人免费视频精品含羞草妖精| 天天操天天色综合| 亚洲第一电影网| 亚洲精品国产品国语在线app| 中文欧美字幕免费| 国产亚洲一本大道中文在线| 日韩精品中文字幕在线不卡尤物 | 色婷婷综合激情| 91免费视频观看| av资源站一区| 99精品在线观看视频| 成人在线一区二区三区| 成人午夜av在线| 成人性生交大片免费看中文网站| 国产99久久久久| 成人深夜福利app| 国产99久久精品| av在线综合网| 色婷婷国产精品久久包臀| 91免费版pro下载短视频| 91在线视频官网| 色94色欧美sute亚洲线路一ni| 91在线国产观看| 91国产福利在线| 欧美精品精品一区| 日韩欧美综合一区| 精品电影一区二区三区| 国产日韩一级二级三级| 欧美国产激情一区二区三区蜜月| 国产精品久久久久影院老司 | 亚洲第四色夜色| 青娱乐精品视频| 国产精品99久| 97久久精品人人爽人人爽蜜臀| 日本高清不卡视频| 欧美一区国产二区| 2023国产精华国产精品| 中文字幕 久热精品 视频在线| 亚洲欧美在线视频| 天天综合网 天天综合色| 韩国av一区二区三区四区| 成人高清在线视频| 91久久国产最好的精华液| 欧美性色欧美a在线播放| 欧美一区二区三区视频| 日本一区二区视频在线观看| 一区二区三区欧美在线观看| 免费在线观看视频一区| 成人午夜在线视频| 欧美日韩亚洲另类| 国产亚洲短视频| 亚洲自拍与偷拍| 久久99精品久久久久久久久久久久| 成人av在线播放网址| 7777精品伊人久久久大香线蕉的 | 精品国产伦一区二区三区观看体验 | 日韩一区二区电影在线| 国产精品网曝门| 日本中文字幕一区二区有限公司| 国产成人99久久亚洲综合精品| 日本大香伊一区二区三区| 精品国产伦一区二区三区免费| 亚洲免费成人av| 国产成a人亚洲| 欧美四级电影网| 中文字幕高清不卡| 日本不卡123| 色婷婷综合久色| 国产精品网站在线| 久久精品久久精品| 欧美视频一区二区三区四区| 久久精品夜色噜噜亚洲aⅴ| 日韩国产欧美在线观看| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产一区二区调教| 欧美电影影音先锋| 亚洲美女在线国产| 成人一道本在线| 337p日本欧洲亚洲大胆色噜噜| 洋洋av久久久久久久一区| 国产91精品一区二区麻豆亚洲| 日韩视频在线观看一区二区| 亚洲综合激情另类小说区| 成人av资源在线| 国产欧美日韩另类一区| 久久精品国产77777蜜臀| 91.xcao| 午夜a成v人精品| 欧美视频三区在线播放| 一卡二卡三卡日韩欧美| 91美女片黄在线观看| 国产精品久久久久久久久免费丝袜 | 日韩高清不卡一区| 欧美性猛交xxxxxxxx| 亚洲激情自拍偷拍| 日本久久一区二区三区| 综合久久国产九一剧情麻豆| 成人深夜在线观看| 国产精品成人午夜| 99久久婷婷国产| 亚洲视频你懂的| 99国产精品一区| 亚洲乱码国产乱码精品精小说| 99精品视频一区| 国产精品三级在线观看| 国产a级毛片一区| 国产精品久久二区二区| av一区二区三区四区| 国产精品久久久久一区二区三区共 | 91精品国产91综合久久蜜臀| 亚洲va韩国va欧美va| 91麻豆精品国产自产在线观看一区| 亚洲午夜久久久久久久久久久| 一本色道亚洲精品aⅴ| 亚洲最新视频在线播放| 欧美午夜视频网站| 日本最新不卡在线| 欧美不卡视频一区| 成人爽a毛片一区二区免费| 国产精品视频免费| 91日韩一区二区三区| 亚洲成a天堂v人片| 精品国产免费人成在线观看| 国产精品一区二区三区四区| 中文字幕av一区二区三区高 | 国产精品一品二品| 亚洲天堂av一区| 欧美精品vⅰdeose4hd| 久久爱www久久做| 国产清纯美女被跳蛋高潮一区二区久久w| 国产成人亚洲精品狼色在线| 中文字幕日韩一区二区| 欧美午夜在线观看| 国产一区二区h| 亚洲激情欧美激情| 日韩一本二本av| 成人国产精品免费| 日韩电影在线一区二区三区|