Member 11380615 Ответов: 2

Как встроить медиаплеер в приложение mfc dialog и воспроизводить файлы.


Привет
Я пытался добавить медиаплеер в свой диалог mfc и вызвать его для воспроизведения URL-адреса. У меня не увенчались успехом.
Операционная система - Windows 10
VS Studio - VS 2013 professional

Моя цель состоит в том, чтобы встроить медиаплеер в мое приложение и передать ему имя файла, чтобы начать воспроизведение.

Шаги, выполненные для добавления медиаплеера.

1. Создание диалогового проекта MFC приложения с помощью элемента управления ActiveX включен.
Проект создает следующие файлы
video.cpp
videoDlg.cpp
видео.ч
videoDlg.ч

2. Перейдите к менеджеру ресурсов
Перейдите в раздел video.rc - Dialog
Дважды щелкните IDD_VIDEO_DIALOG

3. Щелкните правой кнопкой мыши и вставить элемент управления ActiveX на диалоговое окно.
Выберите проигрыватель windows media из списка и нажмите кнопку ОК.

4. щелкните правой кнопкой мыши медиаплеер в диалоговом окне и выберите пункт
мастер классов -> выберите класс mfc из типа lib (только это дает windows media player в качестве опции
Из доступных библиотек выберите "windows media player <1.0>
Затем выберите "ImediaPlayer2" из интерфейсов и добавьте его в сгенерированные классы.
Вышеприведенный шаг создает следующее
Класс CMediaPlayer2 и CMediaPlayer.h заголовочный файл.
Затем я добавляю имя переменной vidctrl типа COcx1
Это создает два файла ocx1.h и ocx1.cpp

Я добавляю vidctrl.open() в свой код инициализации. Он не находит открытую функцию.
Поэтому я копирую функции из CMediaPlayer2.h в ocx1.h

Затем я снова пытаюсь вызвать vidctrl.open (), и он строится.
Когда я запускаю его, появляется окно сообщения с надписью "участник не найден"
Когда я перехожу через него, я обнаруживаю, что окно сообщения появляется при вызове vidctrl.open ().


Я могу отправить файлы проекта в виде zip-файла для этого.
Проблема, с которой я сталкиваюсь, заключается в том, как подключить переменную к интерфейсным функциям?
Любая помощь будет очень признательна.
Спасибо и с уважением,
Ракеша

2 Ответов

Рейтинг:
13

Serkan Onat

Привет
Вот шаги для начала работы с медиаплеером в приложении на основе диалогового окна MFC

1: Создайте новое приложение MFC на основе диалогового окна

2: диалоговое окно конструктора открыть и удалить элемент управления Label, который создается на основе шаблона по умолчанию против

3: щелкните правой кнопкой мыши в диалоговом окне и выберите Вставить элемент управления activex

4: Выберите и вставьте элемент управления Windows Media Player в диалоговое окно

5: Изменение размера и перемещение элемента управления по вашему желанию

6: щелкните правой кнопкой мыши, чтобы управлять и выбрать Добавить Переменную

7. ввод m_MediaPlayer (или все, что вы хотите) в качестве управляющей переменной без изменения какого-либо другого свойства

8: это позволит добавить ocx1.h и ocx1.cpp к проекту , и #include "ocx1.h" также добавляется в основной диалог

9: открыть stdafx.h и добавьте это #include <wmp.h> включите в него директиву

10: Откройте заголовочный файл диалогового класса, содержащего объект Media Player, и добавьте его CComPtr<IWMPPlayer> m_pWMPPlayer; переменная где-то в нем

11: Теперь откройте CPP - файл класса dialog и goto OnInitDialog() и добавьте следующий код

LPUNKNOWN pUnknown = m_MediaPlayerControl.GetControlUnknown();
HRESULT hr = pUnknown->QueryInterface(__uuidof(IWMPPlayer), (void**)&m_pWMPPlayer);
if(SUCCEEDED(hr))
{
	CComBSTR strMovie = _T("Full Path To Movie File");
	m_pWMPPlayer->put_URL(strMovie); 
}


12: постройте и посмотрите результат


Если вы хотите реализовать больше функциональности медиаплеера, то
Взгляните на доступные интерфейсы медиаплеера на сайте MSDN Интерфейсы (Проигрыватель Windows Media)[^]


Member 11380615

Здравствуй Серкан Онат,
Большое вам спасибо за опубликованное вами решение. Я смогу проверить его в ближайшие несколько дней и сообщу вам о результатах.
С уважением,
Ракеша

Member 11380615

Здравствуй Серкан Онат,
Я мог бы реализовать то, что вы сказали, и заставить плеер воспроизвести клип.
Мне нужно обрабатывать событие из медиаплеера и иметь возможность воспроизводить и останавливать его с помощью кода.
Я пытался добавить обработчик и иметь возможность получать дескрипторы для воспроизведения и остановки и другие функциональные возможности. Я не работал.
HRESULT hr1 = pUnknown->QueryInterface(&spConnectionContainer);
если (сменил(ч))
{
hr = spConnectionContainer->FindConnectionPoint(__uuidof(IWMPEvents), &m_spConnectionPoint);
if (FAILED(hr))
{
// Если нет, попробуйте интерфейс _WMPOCXEvents, который использует IDispatch.
hr = spConnectionContainer->FindConnectionPoint(__uuidof(_WMPOCXEvents), &m_spConnectionPoint);
}
}

если (сменил(ч))
{
ч = m_spConnectionPoint-и GT;советую(это, &ампер;m_dwAdviseCookie);
}

Это в советах не компилируется.

Не могли бы вы дать некоторое направление относительно того, как играть, приостанавливать и останавливать из кода также создать обработчик, где я мог бы получить воспроизведение, паузу, остановку и другие события управления медиаплеером.
С уважением,
Ракеша

Serkan Onat

Вам лучше сделать следующее ,потому что контейнер CWnd уже делает это

Диалоговое окно перейти конструктора выберите элемент управления медиа-плеер
А затем его события будут перечислены в панели свойств (вам нужно нажать на значок управления событиями)
Затем вы можете выбрать событие и добавить его в свой проект
Visual Studio автоматически добавит функцию обратного вызова в родительский класс окна точно так же, как и способ MFC
Затем вы можете добавить свой код для реализации процедуры события


Member 11380615

Я не вижу перечисленных событий. Вероятно, я неправильно понимаю, что такое конструктор диалогов. Когда вы говорите dialog designer, я делаю следующее.
Вид -&ресурса gt; имя_проекта.ру -&ГТ; Диалог -&ГТ; IDD_VIDEO_PLAYER(ХХХХХХХ)
Я дважды щелкаю по нему, и мне представляется конструктор диалогов. Он содержит элемент управления windows media player active X. Я выбираю его, но не вижу никакой панели свойств со списком событий. То, что я вижу, - это окно свойств в правом нижнем углу, в котором есть такие элементы, как "открытое состояние", "состояние воспроизведения", "url", "видео без окон".
Я неправильно понял, что вы подразумеваете под диалоговым дизайнером.
С уважением,
Ракеша

Serkan Onat

Как я уже говорил в предыдущем сообщении вам нужно нажать значок Control Events чтобы увидеть список событий
смотрите изображение :

http://i.hizliresim.com/a2YOYd.png

Member 11380615

Здравствуй Серкан Онат,
Кажется, я получил четный список обработчиков. Когда я щелкаю правой кнопкой мыши на элементе управления медиаплеером, он дает мне возможность добавить четный обработчик. Я добавлю отсюда и попытаюсь проверить это. Это, кажется, отличается от того, что ты имел в виду.
С уважением,
Rakesg

Member 11380615

Спасибо,
Я получил это событие.
С уважением,
Ракеша

Member 11380615

Здравствуй Серкан Онат,
Я пытался заставить медиаплеер играть в полноэкранном режиме. Я получаю исключение времени выполнения для hrFull )ниже в коде), которое говорит о катастрофическом сбое E_UNEXPECTED. Я вижу это, когда ставлю точку останова, иначе код работает нормально, хотя и не переходит в полноэкранный режим. Щелкнув правой кнопкой мыши на работающем медиаплеере и выбрав zoom full screen, я могу играть в полноэкранном режиме.
Моя цель состоит в том, чтобы иметь кнопку нажатия, которая должна воспроизводиться во весь экран.

Приведенный ниже код-это то, что я использую. Этот код находится в InitDialog.

LPUNKNOWN pUnknown = m_MediaPlayer.GetControlUnknown();
//LPUNKNOWN pUnknown1 = m_MediaPlayer1.GetControlUnknown();


HRESULT hr = pUnknown->QueryInterface(__uuidof(IWMPPlayer), (void**)&m_pWMPPlayer);
//HRESULT hr1 = pUnknown1->QueryInterface(__uuidof(IWMPPlayer), (void**)&m_pWMPPlayer1);


если (сменил(ч))
{
CComBSTR strMovie = _T("C:\\movie\\Hero 2004.mp4");
m_pWMPPlayer->put_URL(strMovie);


VARIANT_BOOL bSc = VARIANT_TRUE;
HRESULT hrFull;

hrFull = m_pWMPPlayer->put_fullScreen(bSc);

}

С нетерпением жду Вашего указания о том, что можно сделать для полноэкранного режима.
С уважением,
Ракеша

Serkan Onat

Я попробовал то, что вы сказали, и это прекрасно сработало здесь (Windows 10 X64) Visual Studio 2010
если у вас есть проблемы со старой версией ,то вы можете попробовать интерфейс IWMPPlayer2 вместо этого

кроме того проверьте зависимости версий интерфейсов WMP на сайте MSDN по ссылке которую я предоставил в первом сообщении

P. S : лично я не использовал WMP в приложениях (как размещенных), вместо этого я предпочитаю LibVLC , и я всегда предлагаю использовать LibVLC, когда меня спрашивают

Member 11380615

Здравствуй Серкан Онат,
Я действительно задал этот вопрос в codeproject. Было предложено, чтобы я попытался поставить его в полноэкранном режиме только тогда, когда он играет. Дождитесь события воспроизведения, а затем поставьте полный экран. Я сделал это, и это сработало.
Спасибо за предложение.
Будем стараться с IWMPPlayer2
Попробую также LibVLC.
С уважением,
Ракеша

Member 13999828

Я немного озадачен этим:

Я могу вставить элемент управления нормально, но с этого момента инструкции для меня не работают. Следующий:

6: щелкните правой кнопкой мыши для управления и выберите добавить переменную

7: введите m_MediaPlayer (или что вы хотите) в качестве управляющей переменной, не изменяя никаких других свойств

8: это добавит ocx1.h и a ocx1.cpp к проекту , и #include "ocx1.h" также добавляется в главный диалог.

неясный.

а) щелкните правой кнопкой мыши на элементе управления или самом диалоговом окне?
б) какой тип m_MediaPlayer ?
в) заголовок ocx1 и исходные файлы не добавляются в мой.

Когда я выполняю описанные выше шаги, все, что добавляется в Мои файлы, - это переменная m_MediaPlayer типа COCX.
Тип COCX впоследствии не распознается компилятором.

Пожалуйста помочь.

БУ, рез.

Рейтинг:
1

Member 13999828

Я немного озадачен этим:

Я могу вставить элемент управления нормально, но с этого момента инструкции для меня не работают. Следующий:

6: щелкните правой кнопкой мыши для управления и выберите добавить переменную

7: введите m_MediaPlayer (или что вы хотите) в качестве управляющей переменной, не изменяя никаких других свойств

8: это добавит ocx1.h и a ocx1.cpp к проекту , и #include "ocx1.h" также добавляется в главный диалог
.

неясный.

а) щелкните правой кнопкой мыши на элементе управления или самом диалоговом окне?
б) какой тип m_MediaPlayer ?
в) заголовок ocx1 и исходные файлы не добавляются в мой.

Когда я выполняю описанные выше шаги, все, что добавляется в Мои файлы, - это переменная m_MediaPlayer типа COCX.
Тип COCX впоследствии не распознается компилятором.

Пожалуйста помочь.

БУ, рез.