原文出处:http://www.cppblog.com/lai3d/archive/2008/12/24/70202.html
作者:七星重剑
该是自己动手来写的时候了,最简单的代码能突出重点。
自己建个win32项目,选择空项目。
CMovie类来自于
Microsoft Platform SDK for Windows Server 2003 R2/Samples/Multimedia/DirectShow/VMR9/VMRPlayer/
中的vcdplyer.h,做了一点修改。
程序主体代码用了Direct3D Tutorial 3: Using Matrices的部分代码。
截图:
播放
不播放
项目配置:
位于Microsoft Platform SDK for Windows Server 2003 R2/Samples/Multimedia/DirectShow/BaseClasses
链接:只有这三个d3d9.lib Strmiids.lib Quartz.lib
使用 Unicode 字符集
多线程调试 DLL (/MDd)
核心代码:
// Create the application's window
g_hwnd = CreateWindow( L"D3D Tutorial", L"DShow CMovie Test",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
NULL, NULL, wc.hInstance, NULL );
g_pMovie = new CMovie(g_hwnd);
g_pMovie->OpenMovie(L"C://Program Files//Microsoft Platform SDK for Windows Server 2003 R2//Samples//Multimedia//DirectShow//Media//Video//ruby.avi");
g_pMovie->PlayMovie();
// Initialize Direct3D
if( SUCCEEDED( InitD3D( g_hwnd ) ) )
{
// Show the window
ShowWindow( g_hwnd, SW_SHOWDEFAULT );
UpdateWindow( g_hwnd );
// Enter the message loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render();
}
}
}
UnregisterClass( L"D3D Tutorial", wc.hInstance );
return 0;
}
视频播放时d3d不渲染,不播放的时候才渲染
if(g_pMovie->IsPlaying())
{
RECT rc;
::GetClientRect(g_hwnd, &rc);
g_pMovie->PutMoviePosition(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
g_pMovie->RepaintVideo(g_hwnd, ::GetDC(g_hwnd));
}
else
{
if( NULL == g_pd3dDevice )
return;
// Clear the backbuffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Rendering of scene objects can happen here
// End the scene
g_pd3dDevice->EndScene();
}
// Present the backbuffer contents to the display
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
}