Я пытаюсь воспроизвести фильм с помощью проигрывателя Windows Media, позже добавлю некоторые другие функции.
Ниже приведен код, который я написал:
const CLSID CLSID_WindowsMediaPlayer = {0x6BF52A52, 0x394A, 0x11d3, {0xB1, 0x53, 0x00, 0xC0, 0x4F, 0x79, 0xFA, 0xA6 } };
HRESULT hr;
IWMPPlayer *pMediaPlayer = NULL;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if(FAILED(hr))
{
std::cout << "ERR -- Could not Initialize COM engine for you" << std::endl;
return 0;
}
hr = CoCreateInstance(CLSID_WindowsMediaPlayer, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pMediaPlayer);
if(FAILED(hr))
{
std::cout << "ERR - Could not get WMPPlayer Interface Pointer" << std::endl;
return 0;
}
std::cout << "Got MediaPlayer Pointer" << std::endl;
IWMPSettings *pMediaPlayerSettings = NULL;
hr = pMediaPlayer->get_settings(&pMediaPlayerSettings);
if(FAILED(hr))
{
std::cout << "ERR - Could not get WMPSettings Interface Pointer" << std::endl;
ReleaseInterfaces((IUnknown**)&pMediaPlayer);
return 0;
}
std::cout << "Got MediaPlayerSettings Pointer" << std::endl;
hr = pMediaPlayerSettings->put_autoStart(VARIANT_TRUE);
if(FAILED(hr))
{
std::cout << "ERR - Could not put auto_start to true" << std::endl;
ReleaseInterfaces((IUnknown**)&pMediaPlayerSettings);
ReleaseInterfaces((IUnknown**)&pMediaPlayer);
return 0;
}
std::cout << "Have put it to autostart" << std::endl;
hr = pMediaPlayerSettings->put_volume(50);
if(FAILED(hr))
{
std::cout << "ERR - Could not put volume" << std::endl;
ReleaseInterfaces((IUnknown**)&pMediaPlayerSettings);
ReleaseInterfaces((IUnknown**)&pMediaPlayer);
return 0;
}
std::cout << "Have put volume to listen-able" << std::endl;
hr = pMediaPlayer->put_URL(L"C:\\background.mp3");
if(FAILED(hr))
{
std::cout << "ERR - Could not set URL" << std::endl;
ReleaseInterfaces((IUnknown**)&pMediaPlayerSettings);
ReleaseInterfaces((IUnknown**)&pMediaPlayer);
return 0;
}
std::cout << "Have set URL" << std::endl;
Пока все хорошо. Но файл никогда не проигрывается. После дальнейшего расследования я узнал, что WMPPlayState
никогда не становится wmppsPlaying
Итак, я проверил, если файл открыт с помощью WMPOpenState
но здесь я всегда получаю wmposOpeningUnknownURL
, Сначала я подумал, что это может быть потому, что я положил файл в C:
, который требует прав администратора, но использование другого местоположения также дает тот же результат. Я проверил, если URL, который я установил с помощью put_URL
на самом деле ставится, и да, get_URL
выдает мой набор URL. Я также проверил с различными файлами и форматами.
Более того, Windows Media Player НЕ открыт!
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
Это довольно распространенный выбор. Мы не можем видеть остальную часть вашего кода, но обувь подходит. Это требует от вас сделать Другой вещь, которая является жестким требованием для потока STA. Вы должен качать цикл сообщений. Невыполнение этого требования вызывает различные проблемы, тупик не является редкостью. И да, состояние не изменится, сигнализация между рабочими потоками внутри WMP и потоком вашей квартиры не работает, потому что вы не качаете.
Вы получаете цикл сообщений в приложении с графическим интерфейсом, например, выбираете шаблон проекта Win32 Project, а не шаблон консольного приложения Win32. Или добавьте код, шаблон это:
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
И будьте осторожны, что у вас нет окна, вы запросили CLSCTX_INPROC_SERVER. Другими словами, WMP работает внутри вашей программы. Чтобы получить окно, нужно использовать хостинг ActiveX, а не то, что вы обычно решали бы без значительной помощи от библиотек классов, таких как MFC или Winforms. Может быть, то, что вы действительно хотели сделать, это запустить его вне процесса, чтобы он мог отображать свое собственное окно?
Вы можете получить непосредственно IWMPPlayer4 интерфейс, который проще в использовании, например:
IWMPPlayer4 *pMediaPlayer;
CoCreateInstance(CLSID_WindowsMediaPlayer, NULL, CLSCTX_ALL, IID_IWMPPlayer4, (void**)&pMediaPlayer);
pMediaPlayer->openPlayer(_bstr_t(L"C:\\background.mp3"));