首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

自己用directshow写的播放器 释放内存下好像有有关问题

2012-09-02 
自己用directshow写的播放器 释放内存上好像有问题自己用directshow写的播放器 释放内存上好像有问题 每放

自己用directshow写的播放器 释放内存上好像有问题
自己用directshow写的播放器 释放内存上好像有问题 每放一个电影占用内存都会增加4mb左右 不知道哪里没有释放掉 求高手看看。。。

///player.cpp

#include "CSampleGrabberCB.h"
#pragma comment(lib,"Strmiids.lib")
#define TIMERID 1
#define BUTTONNUM 7
#define SCROLLRANGE 500
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent=NULL;
IVideoWindow *pVidWin = NULL;
IBasicAudio *pAudio=NULL;
IMediaSeeking *pSeeking=NULL;

IBaseFilter *pGrabberF=NULL;
ISampleGrabber *pGrabber=NULL;


const int InfoWindowWidth=400;
const int InfoWindowHeight=600;
const int volumes[] = {-10000,-6418,-6147,-6000,
-5892,-4826,-4647,-4540
-4477, -4162,-3876, -3614, -3500,
-3492,-3374,-3261,-3100,-3153,-3048,-2947,-2849,-2755,-2700,
-2663,-2575,-2520,-2489,-2406,-2325,-2280,-2246,-2170,-2095,-2050,
-2023,-1952,-1900, -1884,-1834, -1820, -1800,-1780, -1757,-1695,-1636,-1579,
-1521,-1500,-1464,-1436,-1420, -1408,-1353,-1299,-1246,-1195,-1144,
-1096,-1060, -1049,-1020,-1003,-957,-912,-868, -800, -774,-784, -760, -744,
-705,-667,-630,-610,-594,-570 ,-558,-525,-493,-462,-432,-403,
-375,-348,-322,-297,-285, -273,-250,-228,-207,-187,-176, -168,
-150,-102,-75,-19,-10,0,0};

TCHAR *content[]={TEXT("打开"),TEXT("播放"),TEXT("暂停"),TEXT("停止"),TEXT("增大音量"),TEXT("减小音量"),TEXT("截图")};
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
DWORD dwRegister;

void RemoveFromRot(DWORD pdwRegister);
HRESULT AddToRot(IUnknown *pUnkGraph,DWORD *pdwRegister);
BOOL HasVideo(IGraphBuilder *pGraph);
//获取音量
int myGetVolume()
{
int i;
if (pAudio == NULL) return 0;
long volume = 0;
pAudio->get_Volume(&volume);
 for (i=0;i<100;i++)
if (volumes[i] >= volume) 

volume = volumes[i]; 
break; 
}
return i;
}

//设置音量
void mySetVolume(int value)
{
int nowVolume=myGetVolume()+value;
nowVolume=nowVolume>100?100:nowVolume;
nowVolume=nowVolume<0?0:nowVolume;
pAudio->put_Volume(volumes[nowVolume]);
}

//初始化接口
void myInit()
{
LRESULT hr;
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
MessageBox(NULL,TEXT("ERROR - Could not create the Filter Graph Manager."),TEXT(""),0);
return ;
}
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
pGraph->QueryInterface(IID_IBasicAudio,(void **)&pAudio);
pGraph->QueryInterface(IID_IMediaSeeking,(void **)&pSeeking);

hr=CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void **)&pGrabberF);
if (FAILED(hr))
{
MessageBox(NULL,TEXT("ERROR - Could not create the SampleGrabber."),TEXT(""),0);
return ;
}
pGraph->AddFilter(pGrabberF,L"Sample Grabber");

hr=pGrabberF->QueryInterface(IID_ISampleGrabber,(void **)&pGrabber);
if (FAILED(hr))
{
MessageBox(NULL,TEXT("ERROR - Could not create the SampleGrabber."),TEXT(""),0);
return ;
}
AM_MEDIA_TYPE mt;
ZeroMemory(&mt,sizeof(AM_MEDIA_TYPE));
mt.majortype=MEDIATYPE_Video;
mt.subtype=MEDIASUBTYPE_RGB24;
pGrabber->SetMediaType(&mt);
pGrabber->SetOneShot(FALSE);
pGrabber->SetBufferSamples(TRUE);
}

//释放所有接口
void myRelease()
{
pControl->Stop();
pVidWin->put_Visible(OAFALSE);


pVidWin->put_Owner(NULL); 

IEnumFilters *pEnum=NULL;
HRESULT hr=pGraph->EnumFilters(&pEnum);
if(SUCCEEDED(hr))
{
IBaseFilter *pFilter=NULL;
while(S_OK==pEnum->Next(1,&pFilter,NULL))
{
pGraph->RemoveFilter(pFilter);
pEnum->Reset();
pFilter->Release();
}
pEnum->Release();
}

pGraph->Release();
pGrabber->Release();
pGrabberF->Release();
pControl->Release();
pEvent->Release();
pVidWin->Release();
pAudio->Release();
pSeeking->Release();
}

//将视频绑定到指定窗口
void mySetWindow(HWND hwnd,HWND VideoWindow)
{
//pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
pVidWin->put_Owner((OAHWND)VideoWindow);
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
RECT grc;
GetClientRect(VideoWindow, &grc);
pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
pVidWin->put_MessageDrain(OAHWND(hwnd));
}

//全屏播放
void mySetFullScreen(BOOL &isFullScreen)
{
int sysWidth = GetSystemMetrics ( SM_CXSCREEN ); 
int sysHeight= GetSystemMetrics ( SM_CYSCREEN ); 
pVidWin->put_Owner(NULL);//否则显示的仍旧限与对话框中pic控件大小
pVidWin->SetWindowPosition(0, 0, sysWidth,sysHeight);
isFullScreen=TRUE;
}

//全屏恢复
void myRestoreScreen(IVideoWindow *pVidWin,HWND VideoWindow, BOOL &isFullScreen)
{
pVidWin->put_Owner(OAHWND(VideoWindow));
RECT grc;
GetClientRect(VideoWindow, &grc);
pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
isFullScreen=FALSE;
}

//注册组件
HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{
IMoniker * pMoniker;
IRunningObjectTable *pROT;
if (FAILED(GetRunningObjectTable(0, &pROT))) {
return E_FAIL;
}
WCHAR wsz[256];
wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if (SUCCEEDED(hr)) {
hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}

//移除组件
void RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
pROT->Revoke(pdwRegister);
pROT->Release();
}
}

//显示Graph中的Filter信息
void ShowFilterInfo(IGraphBuilder *pGraph,HWND hInfo,int cxChar,int cyChar)
{
IEnumFilters *pEnumFilters=NULL;
IBaseFilter *pFilter=NULL;
IEnumPins *pEnumPins=NULL;
IPin *pPin=NULL;

int iLength;
TCHAR szBuff[256];
InvalidateRect(hInfo,NULL,TRUE);
PAINTSTRUCT ps;
FILTER_INFO finfo;
pGraph->EnumFilters(&pEnumFilters);
int nowX=5;
int nowY=0;
HDC hdc=BeginPaint(hInfo,&ps);

AM_MEDIA_TYPE mt;
PIN_INFO pinfo;
TCHAR *text[]={TEXT("FilterName"),TEXT("Pin Name"),TEXT("MajorType"),TEXT("SubType"),TEXT("FormatType")};
while(S_OK==pEnumFilters->Next(1,&pFilter,NULL))
{
pFilter->QueryFilterInfo(&finfo);

iLength=wsprintf(szBuff,TEXT("%s :%s"),text[0],finfo.achName);
TextOut(hdc,0,nowY,szBuff,iLength);
nowY+=cyChar;
pFilter->EnumPins(&pEnumPins);
nowX+=10;
//CMediaType ct;

while(S_OK==pEnumPins->Next(1,&pPin,NULL))
{
pPin->ConnectionMediaType(&mt);
pPin->QueryPinInfo(&pinfo);
iLength=wsprintf(szBuff,TEXT("%s: %s"),text[1],pinfo.achName);
TextOut(hdc,nowX,nowY,szBuff,iLength);
nowY+=cyChar;
iLength=wsprintf(szBuff,TEXT("%s: %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"),text[2],


mt.majortype.Data1,mt.majortype.Data2,mt.majortype.Data3,mt.majortype.Data4[0],mt.majortype.Data4[1],
mt.majortype.Data4[2],mt.majortype.Data4[3],mt.majortype.Data4[4],mt.majortype.Data4[5],mt.majortype.Data4[6],
mt.majortype.Data4[7]);
TextOut(hdc,nowX,nowY,szBuff,iLength);
nowY+=cyChar;
iLength=wsprintf(szBuff,TEXT("%s: %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"),text[3],
mt.subtype.Data1,mt.subtype.Data2,mt.subtype.Data3,mt.subtype.Data4[0],mt.subtype.Data4[1],
mt.subtype.Data4[2],mt.subtype.Data4[3],mt.subtype.Data4[4],mt.subtype.Data4[5],mt.subtype.Data4[6],
mt.subtype.Data4[7]);
TextOut(hdc,nowX,nowY,szBuff,iLength);
nowY+=cyChar;
iLength=wsprintf(szBuff,TEXT("%s: %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"),text[4],
mt.formattype.Data1,mt.formattype.Data2,mt.formattype.Data3,mt.formattype.Data4[0],mt.formattype.Data4[1],
mt.formattype.Data4[2],mt.formattype.Data4[3],mt.formattype.Data4[4],mt.formattype.Data4[5],mt.formattype.Data4[6],
mt.formattype.Data4[7]);
TextOut(hdc,nowX,nowY,szBuff,iLength);
nowY+=cyChar;
}
nowX=0;
}
EndPaint(hInfo,&ps);

pPin->Release();
pEnumPins->Release();
pFilter->Release();
pEnumFilters->Release();

}

//检查是否有视频信息
BOOL HasVideo(IGraphBuilder *pGraph)
{
IEnumFilters *pEnumFilters=NULL;
IBaseFilter *pFilter=NULL;
IEnumPins *pEnumPins=NULL;
IPin *pPin=NULL;
pGraph->EnumFilters(&pEnumFilters);
AM_MEDIA_TYPE mt;
while(S_OK==pEnumFilters->Next(1,&pFilter,NULL))
{
pFilter->EnumPins(&pEnumPins);
while(S_OK==pEnumPins->Next(1,&pPin,NULL))
{


pPin->ConnectionMediaType(&mt);
if(mt.majortype==MEDIATYPE_Video)
{
pPin->Release();
pEnumPins->Release();
pFilter->Release();
pEnumFilters->Release();
return TRUE;
}
}
}
pPin->Release();
pEnumPins->Release();
pFilter->Release();
pEnumFilters->Release();
return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{

static TCHAR szAppName[]=TEXT("myPlayer");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Failed in Registe!"),TEXT("ERROR"),0);
return -1;
}
hwnd=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

//未完


[解决办法]
兄弟,没人愿意义务给你阅读如此大量代码帮你分析原因的
[解决办法]
这么长...

热点排行