IGraphBuilder *pGraph->RenderFile(argv[1], NULL); //L"C:////Example.avi", NULL);

#ifndef  UNICODE
#define  UNICODE
#endif
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>			// MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <streams.h>

//void main(int n, TCHAR **argv) 
void _tmain(int n, TCHAR **argv) 
{ 
	if(n!=2)
	{
		printf("No file input!\n"); 
		return;
	}
    IGraphBuilder *pGraph = NULL; 
    IMediaControl *pControl = NULL; 
    IMediaEvent   *pEvent = NULL;

    // Initialize the COM library. 
    HRESULT hr = CoInitialize(NULL); 
    if (FAILED(hr)) 
    { 
        printf("ERROR - Could not initialize COM library"); 
        return; 
    }

    // 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; 
    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); 
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    // Build the graph. IMPORTANT: Change this string to a file on your system. 
    hr = pGraph->RenderFile(argv[1], NULL);  //L"C:Example.avi", NULL); 
	//hr = pGraph->RenderFile(L"C:\\DX90SDK\\Samples\\Media\\CLOCKTXT.avi", NULL); 
    if (SUCCEEDED(hr)) 
    { 
        // Run the graph. 
        hr = pControl->Run(); 
        if (SUCCEEDED(hr)) 
        { 
            // Wait for completion. 
            long evCode; 
            pEvent->WaitForCompletion(INFINITE, &evCode);

            // Note: Do not use INFINITE in a real application, because it 
            // can block indefinitely. 
        } 
    } 
    pControl->Release(); 
    pEvent->Release(); 
    pGraph->Release(); 
    CoUninitialize(); 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最近学了一些游戏开发必不可少的MP3文件播放知识。首先,我的目标机器是windows,所以这些是在windows平台下开发的。随后我学到,要直接解码MP3文件是非常的困难的。因为MP3文件的闭源,我们都没有知道怎样才能一个一个地解码。好在DirectShow帮我们解决了解码的工作,我们需要的只是加入头文件,并且手动链接库文件,使用它的函数就行了。 为了使用它的函数,我们必须加入头文件dshow.h。这个头文件是不容易找到的。以后的DirectX里面都没有了DirectShow的踪影。我只好下载2004年十二月的DirectX版本,这个版本里就有dshow.h。好了,我们加入这个头文件不外乎就是要加一些接口。这里我列举这一些接口的名字: IGraphBuilder IMediaControl IMediaEventEx 为了能够解析IGraphBuilder这个符号,我们还要手动地链接Strmiids.lib库。这个库不是特别的显眼,但是没有它我们的程序就无法通过。 好了,准备工作做好了后,我们开始写一个类了。这个类很简单,叫CMP3。这个类里面嵌入了另外一个MP3标签类CMP3Tag。下面就是我这个类的代码。 class CMP3 { public: CMP3( void ) // 默认构造函数 { m_GraphBuilder = NULL; m_MediaControl = NULL; m_MediaEventEx = NULL; m_IsPlaying = false; } ~CMP3( void ); // 析构函数 bool LoadMP3File( TString strFilename ); // 读取MP3文件 bool Play( void ); // 播放MP3文件 void ProcessNotification( void ); // 处理通知 CMP3Tag GetMP3Tag( void ) { return m_tag; } // 获取MP3标签 bool IsPlaying( void ) { return m_IsPlaying; } // 判断是否正在播放 private: bool m_IsPlaying; IGraphBuilder* m_GraphBuilder; IMediaControl* m_MediaControl; IMediaEventEx* m_MediaEventEx; CMP3Tag m_tag; };
您可以使用DirectShow来打开本地机器上的摄像头。以下是使用DirectShow打开摄像头的示例代码: ```c++ #include <windows.h> #include <dshow.h> int main() { IGraphBuilder* pGraph = NULL; ICaptureGraphBuilder2* pCapture = NULL; IBaseFilter* pCamera = NULL; IMediaControl* pControl = NULL; IMediaEvent* pEvent = NULL; CoInitialize(NULL); // 创建图形构建器 CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); // 创建捕获图形构建器 CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pCapture); // 捕获视频输出设备(摄像头)的过滤器 if (pCapture->SetFiltergraph(pGraph) != S_OK || pCapture->FindInterface(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCamera, IID_IBaseFilter, (void**)&pCamera) != S_OK) { printf("Failed to find video capture device\n"); return -1; } // 将视频输出设备添加到图形构建器 pGraph->AddFilter(pCamera, L"Camera"); // 创建视频渲染器 IBaseFilter* pRenderer = NULL; CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pRenderer); // 将视频渲染器添加到图形构建器 pGraph->AddFilter(pRenderer, L"Renderer"); // 连接视频输出设备和视频渲染器 if (pGraph->ConnectDirect(GetPin(pCamera, PINDIR_OUTPUT), GetPin(pRenderer, PINDIR_INPUT), NULL) != S_OK) { printf("Failed to connect video capture device\n"); return -1; } // 获取媒体控制接口 pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl); // 获取媒体事件接口 pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent); // 开始捕捉视频 pControl->Run(); // 等待直到用户按下“q”键 bool quit = false; while (!quit) { if (_kbhit() && _getch() == 'q') quit = true; } // 停止捕捉视频 pControl->Stop(); // 释放资源 pEvent->Release(); pControl->Release(); pRenderer->Release(); pCamera->Release(); pCapture->Release(); pGraph->Release(); CoUninitialize(); return 0; } IPin * GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir) { IEnumPins *pEnum = NULL; IPin *pPin = NULL; pFilter->EnumPins(&pEnum); while (pEnum->Next(1, &pPin, NULL) == S_OK) { PIN_DIRECTION ThisPinDir; pPin->QueryDirection(&ThisPinDir); if (ThisPinDir == PinDir) { return pPin; } pPin->Release(); } pEnum->Release(); return NULL; } ``` 上述例子演示了如何使用DirectShow打开本地机器上的摄像头。具体来说,代码会: - 创建一个图形构建器和一个捕获图形构建器 - 捕获本地机器上的视频输出设备(摄像头)的过滤器 - 将视频输出设备添加到图形构建器 - 创建一个视频渲染器,并添加到图形构建器 - 连接视频输出设备和视频渲染器 - 开始捕捉视频 - 等待直到用户按下“q”键 - 停止捕捉视频 请注意,此代码仅适用于 Windows 平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值