📄 player.cpp
字号:
// player.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <dshow.h>
#include "stdio.h"
#include <streams.h>
//#include "strmif.h"
#define PLAYFILE L"D:\\football.264"
HRESULT GetUnconnectedPin(
IBaseFilter *pFilter, // Pointer to the filter.
PIN_DIRECTION PinDir, // Direction of the pin to find.
IPin **ppPin) // Receives a pointer to the pin.
{
*ppPin = 0;
IEnumPins *pEnum = 0;
IPin *pPin = 0;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}
while (pEnum->Next(1, &pPin, NULL) == S_OK)
{
PIN_DIRECTION ThisPinDir;
pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir == PinDir)
{
IPin *pTmp = 0;
hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr)) // Already connected, not the pin we want.
{
pTmp->Release();
}
else // Unconnected, this is the pin we want.
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();
// Did not find a matching pin.
return E_FAIL;
}
HRESULT ConnectFilters(
IGraphBuilder *pGraph, // Filter Graph Manager.
IPin *pOut, // Output pin on the upstream filter.
IBaseFilter *pDest) // Downstream filter.
{
if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL))
{
return E_POINTER;
}
#ifdef debug
PIN_DIRECTION PinDir;
pOut->QueryDirection(&PinDir);
_ASSERTE(PinDir == PINDIR_OUTPUT);
#endif
//找一个空闲的输入pin
IPin *pIn = 0;
HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
if (FAILED(hr))
{
return hr;
}
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
return hr;
}
HRESULT ConnectFilters(
IGraphBuilder *pGraph,
IBaseFilter *pSrc,
IBaseFilter *pDest)
{
if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL))
{
return E_POINTER;
}
// 首先在第一个filter上查询一个输出的pin接口
IPin *pOut = 0;
HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (FAILED(hr))
{
return hr;
}
//然后将它和第二个filter的输入接口衔接。
hr = ConnectFilters(pGraph, pOut, pDest);
pOut->Release();
return hr;
}
HRESULT AddFilterByCLSID(
IGraphBuilder *pGraph, // Pointer to the Filter Graph Manager.
const GUID& clsid, // CLSID of the filter to create.
LPCWSTR wszName, // A name for the filter.
IBaseFilter **ppF) // Receives a pointer to the filter.
{
if (!pGraph || ! ppF) return E_POINTER;
*ppF = 0;
IBaseFilter *pF = 0;
HRESULT hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, reinterpret_cast<void**>(&pF));
if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pF, wszName);
if (SUCCEEDED(hr))
*ppF = pF;
else
pF->Release();
}
return hr;
}
int main(int argc, char* argv[])
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
//IFileSourceFilter *p1;
//p1->Load(L"D:\\football.264", NULL);
//pGraph->AddSourceFilter(wszInputFile, L"Source Filter", &pSrc);
IBaseFilter *p1;
IBaseFilter *p2;
IBaseFilter *p3;
IBaseFilter *p4;
IPin *p1Out = NULL;
const GUID CLSID_FS={0xE436EBB5,0x524F,0x11CE,{0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70} };
const GUID CLSID_MEPD={0x731B8592,0x4001,0x46D4,{0xB1,0xA5,0x33,0xEC,0x79,0x2B,0x45,0x01} };
const GUID CLSID_MHVD={0x04B31EE9,0xEC66,0x4CED,{0x8F,0xF4,0xA9,0xE7,0xE2,0x2D,0x1D,0x8B} };
const GUID CLSID_VR={0x6BC1CFFA,0x8FC1,0x4261,{0xAC,0x22,0xCF,0xB4,0xCC,0x38,0xDB,0x50} };
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return 0;
}
// Create the filter graph manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return 0;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = AddFilterByCLSID(pGraph, CLSID_FS, L"File Source", &p1);
hr = AddFilterByCLSID(pGraph, CLSID_MEPD, L"Moonlight-Elecard MPEG2 Demultiplexer", &p2);
hr = AddFilterByCLSID(pGraph, CLSID_MHVD, L"Moonlight H.264 Video decoder", &p3);
hr = AddFilterByCLSID(pGraph, CLSID_VR, L"Video Renderer", &p4);
//set the source file
IFileSourceFilter * pLoader;
p1->QueryInterface(IID_IFileSourceFilter, (void **)&pLoader);
hr=pLoader->Load(PLAYFILE,NULL);
if (FAILED(hr))
{
printf("装载文件出错!\n");
return 0;
}
//connect the filters
hr = ConnectFilters(pGraph, p1, p2);
p1->Release();
hr = ConnectFilters(pGraph, p2, p3);
p2->Release();
hr = ConnectFilters(pGraph, p3, p4);
p3->Release();
p4->Release();
//play the file
pControl->Run();
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Release();
pEvent->Release();
pGraph->Release();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -