Консультация № 174856
04.12.2009, 03:05
0.00 руб.
0 2 1
Добрый день! Мне необходимо написать программу, которая воспроизводит wmv файл с помощью DirectShow и может управлять воспроизведением (пауза, стоп, запустить), язык программирования С++, среда разработки С++Builder
Проблема в том, что когда в моём приложении воспроизводится видео, сама форма блокируется.. и я не могу нажимать на ней кнопки.. даже закрыть не могу до тех пор, пока не закончится ролик
Я пытался решить проблему с помощью создания отдельного потока через TThread, но результатов это не принесло
Также хотелось бы увидеть пример построения графа без использования IntelligentConnect


Приложение:
void Treads::PlayRun(TOpenDialog* OpenDialog)
{
Form2->Show();
TPanel *PlayWindPanel=Form2->Panel1;
//Если файл не выбран, выходим из функции
if(!OpenDialog->Execute()) {ErrSend("Файл не выбран"); return;}
if(!PlayWindPanel){ErrSend("Панель не указана"); return;}

//Объявляем переменые
IGraphBuilder * pGraph(NULL); //Интерфейс менеджера графа-фильтров
IMediaControl * pControl(NULL); //Интерфейс управления
IMediaEvent * pEvent(NULL); //Интерфейс сообщений
ICaptureGraphBuilder2 * pCapGraph(NULL);
IBaseFilter * pSourceFile(NULL);//Фильтр файла-источника
IVideoWindow * pVWindow(NULL); //интерфейс окна для отображения в нем видео


//Создание графа фильтров
HRESULT hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if(FAILED(hr)){ErrSend("Не удалось создать граф фильтров"); return;}


// Создаем ICaptureGraphBuilder2:
hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,(void **)&pCapGraph);
if(FAILED(hr)){ErrSend("Не удалось создать ICaptureGraphBuilder2"); return;}


//Указываем CaptureGraphBuilder2 граф фильтров для использования:
hr=pCapGraph->SetFiltergraph(pGraph);
if(FAILED(hr)){ErrSend("Не удалось установить граф фильтров"); return;}

// Теперь добавляем к графу фильтров фильтр источника следующим образом:
hr=pGraph->AddSourceFilter(StringToOleStr(OpenDialog->FileName),L"",
&pSourceFile);
if(FAILED(hr)){ErrSend("Не удалось инициализировть фильтр источника");return;}


//Получение интерфейса управления
hr=pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);
if(FAILED(hr)){ErrSend("Не удается получить интерфейс MediaControl"); return;}


//Получение интерфейса сообщений
hr=pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent);
if(FAILED(hr)){ErrSend("Не удается получить интерфейс сообщений"); return;}


// Рендерим файл
pCapGraph->RenderStream(NULL,NULL,pSourceFile,NULL,NULL);

// Все готово для получения видеоокна:
hr=pGraph->QueryInterface(IID_IVideoWindow,(void **)&pVWindow);

// Установим теперь владельца окна, стиль и положение:
pVWindow->put_Owner((long)PlayWindPanel->Handle);
pVWindow->put_WindowStyle(WS_CHILD);
pVWindow->put_Left(0);
pVWindow->put_Width(PlayWindPanel->Width);
pVWindow->put_Top(0);
pVWindow->put_Height(PlayWindPanel->Height);


//Запуск воспроизведения
hr=pControl->Run();
if(FAILED(hr)){ErrSend("Не удалось воспроизвести файл"); return;}

//Проигрываем файл до конца
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
return;

Обсуждение

Неизвестный
04.12.2009, 09:49
общий
это ответ
Здравствуйте, Лакин И.М..
Я бы в обработчик событий Form2 добавил реагирывание на нажатие кнопок или клавиш клавиатуры. К примеру, при проигрывании ролика нажимаем ESC и передается сообщение на остановку и закрытие формы.
Неизвестный
10.12.2009, 02:43
общий
мне необходимо управлять процессом с формы
Форма ответа