Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.15.1] |
|
Сообщ.
#1
,
|
|
|
ОС - WinMe.
Компилятор - MSVC++ 6.0 + SP5 Нашел на одном сайте (кому интересно - http://fisherus-prime.hotbox.ru) пример, как проиграть MP3-файл с помощью DirectShow. CoInitialize(NULL); // интерфейсы IGraphBuilder *piGraphBuilder; // граф IMediaControl *piMediaControl; // управление воспроизведением IBasicAudio *piBasicAudio; // управление звуком IMediaEventEx *piMediaEventEx; // получение состояния графа IMediaPosition *piMediaPosition; // Инициализация if((CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&piGraphBuilder))) { piGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&piMediaControl); piGraphBuilder->QueryInterface(IID_IBasicAudio, (void **)&piBasicAudio); piGraphBuilder->QueryInterface(IID_IMediaEventEx, (void **)&piMediaEventEx); piGraphBuilder->QueryInterface(IID_IMediaPosition, (void **)&piMediaPosition); } //подготавливаем путь к файлу WCHAR wcFile[MAX_PATH]; char* szFileName = "c:\\Мои документы\\Какой-то файл.mp3"; if (MultiByteToWideChar(CP_ACP,0,szFileName,-1,wcFile,MAX_PATH)) { //строим граф piGraphBuilder->RenderFile(wcFile,NULL); } // воспроизводим piMediaControl->Run(); // освобождаем все piMediaControl->Release(); piBasicAudio->Release(); piMediaEventEx->Release(); piMediaPosition->Release(); piGraphBuilder->Release(); CoUninitialize(); Так, как в этом примере ничего не было сказано о том, что нужно подключить для доступа к DirectShow, то я методом тыка и поиска в файлах нашел следующее, с чем этот код стал компилиться: #include "amstream.h" #include "control.h" #include "uuids.h" и в настройках проекта Link -> General -> Object\Library modules добавил: strmiids.lib а так же добавил CoInitialize(NULL) и CoUninitialize(). После этого все стало нормально компилиться, но при выполнении происходит ошибка в программе и после выбора Отладки: "Unhandled exception .... Access Violation" и тычет стрелочкой на piMediaControl->Run(); Че делать ? Наверно я не все подключил ? |
Сообщ.
#2
,
|
|
|
правильно ли отработал QueryInterface на piMediaControl?
что возращает RenderFile? у тебя этих проверок нет - поэтому непонятно. |
Сообщ.
#3
,
|
|
|
Ага, понял. Пойду проверять.
|
Сообщ.
#4
,
|
|
|
добрый день тоже появилась потребность играть .mp3-шки
пытаюсь так: CoInitialize(NULL); IGraphBuilder* graphBuilder; if (CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&graphBuilder) == S_OK) { CComPtr<IMediaControl> mediaControl; HRESULT result = graphBuilder->QueryInterface(IID_IMediaControl, (void **)&mediaControl); CComPtr<IBasicAudio> basicAudio; result = graphBuilder->QueryInterface(IID_IBasicAudio, (void **)&basicAudio); CComPtr<IMediaEventEx> mediaEventEx; result = graphBuilder->QueryInterface(IID_IMediaEventEx, (void **)&mediaEventEx); CComPtr<IMediaPosition> mediaPosition; result = graphBuilder->QueryInterface(IID_IMediaPosition, (void **)&mediaPosition); //подготавливаем путь к файлу WCHAR wcFile[MAX_PATH]; char* szFileName = "c:\\Workspace\\test2.mp3"; if (!MultiByteToWideChar(CP_ACP,0,szFileName,-1,wcFile,MAX_PATH)) return; result = graphBuilder->RenderFile(wcFile, NULL); result = mediaControl->Run(); bool stop = true; } CoUninitialize(); все функции (кроме mediaControl->Run() возвращают S_OK. mediaControl->Run() возвращает S_FALSE. что это может быть/как лечить? |
Сообщ.
#5
,
|
|
|
почему возникает ошибка unresolved external symbol _IID_IMediaControl (в Test.obj) и как с ней бороться??????
|
Сообщ.
#6
,
|
|
|
Цитата Ninetta @ почему возникает ошибка unresolved external symbol _IID_IMediaControl (в Test.obj) и как с ней бороться?????? Бороться с ней посредством включения strmiids.lib в проект |
Сообщ.
#7
,
|
|
|
спасибо огромное!!!
а можно ещё вопрос по DirectShow и MFC? мне надо чтобы видео с веб-камеры проигрывалось в окне приложения, где взять хэндл окна? пишу и ничего не происходит: void CTestApp::Run() { HRESULT hr; IGraphBuilder *pGraph = NULL; ICaptureGraphBuilder2 *pBuild = NULL; IBaseFilter *pCapture = NULL; ICreateDevEnum *pDevEnum = NULL; IEnumMoniker* pEnum = NULL; IMoniker* pMoniker = NULL; IMediaControl * pMediaControl(NULL); IMediaEventEx * pEvent(NULL); IVideoWindow *pVidWin = NULL; OAHWND hWnd; hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if(SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild ); if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); if (SUCCEEDED(hr)) { pBuild->SetFiltergraph(pGraph); hr = CoCreateInstance(CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (LPVOID*)&pDevEnum); if(SUCCEEDED(hr)) { hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); if(SUCCEEDED(hr)) { if( pEnum->Next(1, &pMoniker,0) == S_OK ) { hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&pCapture); if(SUCCEEDED(hr)) { pGraph->AddFilter(pCapture, L"Capture Filter"); hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCapture, NULL, NULL); pDevEnum->Release(); pEnum->Release(); pMoniker->Release(); *pVidWin = NULL; pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin); pVidWin->put_Owner((OAHWND)hWnd); pVidWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS ); pVidWin->put_Left(0); pVidWin->put_Top(0); pVidWin->put_Width(640); pVidWin->put_Height(480); pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent); pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0); pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl); pMediaControl->Run(); } else pBuild->Release(); } } } } } } //------------------------------------------------------------------------------------------------ } |
Сообщ.
#8
,
|
|
|
Цитата Ninetta @ мне надо чтобы видео с веб-камеры проигрывалось в окне приложения Передай сюда хендл желаемого окна Цитата Ninetta @ pVidWin->put_Owner((OAHWND)hWnd); Цитата Ninetta @ где взять хэндл окна? Странный вопрос. CWnd::m_hWnd требуемого окна, либо AfxGetApp()->m_pMainWnd |
Сообщ.
#9
,
|
|
|
спасибо!
а можно ещё очень глупый последний (надеюсь) вопрос - где мне вызвать метод CTestApp::Run(), я его вызывала в конце метода CTestApp::InitInstance(), но он у меня в него не заходит(( |
Сообщ.
#10
,
|
|
|
пишу pVidWin->put_Owner((OAHWND)AfxGetApp()->m_pMainWnd);
и не работает. походу не определяет AfxGetApp(), это почему? |
Сообщ.
#11
,
|
|
|
Цитата Ninetta @ где мне вызвать метод CTestApp::Run(), я его вызывала в конце метода CTestApp::InitInstance(), но он у меня в него не заходит(( А из какого примера это все взято? Как ты оформила проект? Сдается мне, там много ошибок. Приведи сюда весь проект целиком |
Сообщ.
#12
,
|
|
|
я без примера - просто создала проект MFC Dialog Based
и попробовала переопределить ф-ю Run кстати когда пришу в файле TestDlg например в функции CTestDlg::OnPaint() всё то же самое, то воспроизводит видео (так что в этом коде ошибок нет), но не в нужном окне. короче вопрос такой - где написать вот этот весь код для вывода видео с веб-камеры? и я кстати исправила как вы сказали: pVidWin->put_Owner((OAHWND)AfxGetApp()->m_pMainWnd); |