⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 player.cpp

📁 VC++自己实现的第一个播放器小程序
💻 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 + -