基于DirectShow的简单播放器
生活随笔
收集整理的這篇文章主要介紹了
基于DirectShow的简单播放器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
一?個簡單的基于DirectShow的打開本地視頻文件的例子。
參考了各種資材,網上很多,也比較簡單,但有個問題就是在調用" RenderFile "函數時只有在x86下都會返回S_OK,很費解。。。待繼續深入研究一下。
代碼:
IGraphBuilder *gGraph = NULL;IMediaControl *gControl = NULL;IMediaEvent *gEvent = NULL;?
bool CreateSimplerPlayer(PTSTR pstrFileName){// init comHRESULT hr = CoInitialize(NULL);if (FAILED(hr))return false;// init gragh builderhr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&gGraph);if (FAILED(hr))return false;// query controler interface in graphbuilderhr = gGraph->QueryInterface(IID_IMediaControl, (void**)&gControl);if (FAILED(hr))return false;// query event interface in graphbuilderhr = gGraph->QueryInterface(IID_IMediaEvent, (void**)&gEvent);if (FAILED(hr))return false;hr = gGraph->QueryInterface(IID_IBasicVo, (void**)&gVideo);if (FAILED(hr))return false; // read a filehr = gGraph->RenderFile(pstrFileName, NULL);if (!FAILED(hr)){hr = gControl->Run();if (SUCCEEDED(hr)){long evCode;gEvent->WaitForCompletion(INFINITE, &evCode);return true;}}return false;}主要就是RenderFile,只要選擇播放的文件,IGraphBuilder就智能地幫你構造出整個Filter Graph。
下面是在控制臺程序中打開文件管理對話框的代碼,選擇好文件后將文件路徑傳給CreateSimplerPlayer。
代碼:
TCHAR szBuffer[MAX_PATH] = { 0 };OPENFILENAME file = { 0 };file.hwndOwner = NULL;file.lStructSize = sizeof(file);file.lpstrFilter = _T("所有文件(*.*)\0*.*\0Exe文件(*.exe)\0*.exe\0");//要選擇的文件后綴 file.lpstrInitialDir = _T("E:\\");//默認的文件路徑 file.lpstrFile = szBuffer;//存放文件的緩沖區 file.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);file.nFilterIndex = 0;file.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//標志如果是多選要加上OFN_ALLOWMULTISELECTBOOL bSel = GetOpenFileName(&file);//cout << file.lpstrFile << endl; SimplePlayer::CreateSimplerPlayer(file.lpstrFile);?
轉載于:https://www.cnblogs.com/-sev-/p/8385396.html
總結
以上是生活随笔為你收集整理的基于DirectShow的简单播放器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python arp断网攻击_arp断网
- 下一篇: SpringBoot2.x系列教程10-