Проиграть .wmv видео

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Здравствуйте, уважаемые форумчане! Я дошёл в изучении C++ до мультимедиа, и застрял на воспроизведении видео. Нужно воспроизвести видеофайл в формате .wmv Просмотрел весь инет, но ничего кроме описаний AVI и DirectShow не нашёл. Может быть, вы мне подскажете, как это можно сделать (естественно, со звуком, в своём собственном окне, не используя DirectShow, и по возможности не используя кодеки, то есть стандартными средствами Windows)? Пока что работаю через mciSendString:
C++:
mciSendString ("Open intro.wmv type mpegvideo alias myFile", NULL, 0, 0);
mciSendString ("Play myFile", NULL, 0, 0);
mciSendString ("Close myFile", NULL, 0, 0);
У этого способа три недостатка:
1. По видимому, создаётся новый поток, и главному потоку приходится ожидать конца видео. В таком случае, как узнать длительность видеофайла?
2. Не могу управлять создаваемым окном, например, изменить его размер или развернуть в полный экран, так как не знаю HWND. А если бы и знал, то растягивалось бы изображение до размера окна...
3. На старом компе ОЧЕНЬ сильно тормозиииииит. На том же компе в Winamp-е всё идёт нормально.
Заранее благодарю за любую помощь.
 
G

Guest

#3
Ну скажите хотя бы какой тут кодек нужен для .wmv видео и как им пользоваться? Или вы и этого не знаете?
 
G

Guest

#4
Вы что вообще с видео дела никогда не имели? Тогда немного изменю свой вопрос:
Даже если я нашёл хэндл этого ActiveMovie Window - как мне развернуть его в полный экран? Например присоединить к нему DirectDraw. Только это не получается... А стандартными средствами Windows на полный экран окна разворачиваются? Или тут только мультимедийные библиотеки помогут?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#5
Есть такая штука, DirectShow называется:
C++:
#include <dshow.h>

int main()
{
long			eventCode;
IGraphBuilder *	pGraphBuilder;
IMediaControl *	pMediaControl;
IMediaEvent *	pMediaEvent;
CoInitialize( NULL );
CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (LPVOID *)&pGraphBuilder );
pGraphBuilder->QueryInterface( IID_IMediaControl, (LPVOID *)&pMediaControl );
pGraphBuilder->QueryInterface( IID_IMediaEvent, (LPVOID *)&pMediaEvent );
pMediaControl->RenderFile( L"c:\\biz\\test2.avi" );
pMediaControl->Run();
pMediaEvent->WaitForCompletion( -1, &eventCode );
pMediaControl->Release();
pGraphBuilder->Release();
CoUninitialize();
return 0;
}
http://msdn.microsoft.com/en-us/library/dd...v=vs.85%29.aspx
WMV тоже должен воспроизводится. Полный экран тоже можно сделать.
 
G

Guest

#6
Да? Странно. Этот DirectShow всё время пылился у меня под рукой, а я его и не замечал?...
Но ещё вопрос. А... какая либа нужна этому DirectShow'у? Quartz что-то не катит

Добавлено: Вообще проблема в том, что Visual C++ не может найти четыре внешних символа:
DShow.obj : error LNK2001: unresolved external symbol _IID_IMediaEvent
DShow.obj : error LNK2001: unresolved external symbol _IID_IMediaControl
DShow.obj : error LNK2001: unresolved external symbol _CLSID_FilterGraph
DShow.obj : error LNK2001: unresolved external symbol _IID_IGraphBuilder
 
G

Guest

#7
Всё, проблему решил. Остаётся только один вопрос - как запустить DirectShow в своём окне?
 
G

Guest

#9
Кое-что в DirectShow я понял. Но без этой штуки тоже можно многие форматы воспроизводить. Например, существует mmio. Начал с ним работать - сразу куча проблем. Самая главная проблема - каким кодом fourcc обозначаются разделы видео и аудио в wmv видео, если видео сжато Windows Media Video V8 (WMV2), аудио сжато Windows Media Audio (WMA). Хотя возможно кодеки тут значения не имеют. В примере программы главный RIFF раздел ищется по коду "WAVE". А какой код нужен мне?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#10
На сколько я знаю mmio не используется для проигрывания (декодирования) видео, он используется для чтения/записи.
 
G

Guest

#11
Для проигрывания или декодирования - нет. Мне нужно именно прочитать данные из файла, а с декодированием и выводом на экран я уже разобрался. Мне нужно знать структуру WMV файла. То есть какие разделы и в каком порядке в нём расположены.
 
G

Guest

#13
Просто не хочется юзать DirectShow ;) Ну и со своим форматом работать проще.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#14
Что-то я не понял.. а как ты собираешься проигрывать WMV файл если DirectShow юзать не хочешь?