Radek Chalupao programování a počítačích, vývoj software, školení ...
Domů | Články | Ukázky kódu | Tipy a triky | Aktuality | Školení a konzultace | Vývoj software | Freeware | Kontakt

Přehrávání multimédií pomocí MCI.  26.1.2002

V tomto pokračování nahlédneme do světa multimédií ve Windows. Naučíme se používat ten nejjednodušší způsob přehrávání multimediálních souborů pomocí tzv. MCI - Media Control Interface. I když v současnosti je již toto rozhraní částečně nahrazováno technologií DirectX, stále má své místo a lze jej s úspěchem používat. Umožňuje nám jednoduchým způsobem přehrávat nejrůznější typy multimediálních souborů, jako zvuky (wav, midi, wma, mp3), videoklipy (avi, wmv, mpeg apod). V podstatě jedinou podmínkou úspěšného přehrání je nainstalovaný kodek, nutný pro soubor daného typu a komprese.

win-api-26

Pro použití MCI musíme přidat hlavičkový soubor Video pro Windows - Vfw.h a odpovídající knihovnu - vfw32.lib. Ukážeme si nyní velice jednoduchý přehrávač, který bude umožňovat vybrat a spustit přehrávání souboru, toto přehrávání kdykoli ukončit a dále během přehrávání jej ručně přerušit a poté ve stejném místě klipu pokračovat v přehrávání. V této ukázce bude samozřejmě použita jen malá část funkcí MCI, takže zájemci o podrobnější proniknutí do této problematiky mohou pokračovat ve studiu dokumentace (nejlépe MSDN).

Pro vytvoření MCI okna přehrávače záznamů použijeme funkci MCIWndCreate, která zaregistruje příslušnou třídu, vytvoří okno a pokud zadáme také jméno souboru, otevře jej a připraví pro přehrávání.

HWND MCIWndCreate(
  HWND hwndParent,      
  HINSTANCE hInstance,  
  DWORD dwStyle,        
  LPSTR szFile          
);

Pokud funkce proběhne úspěšně, vrátí nám handle okna - přehrávače záznamů. Tento handle pak budeme používat jako parametr dalších funkcí, ovládajících přehrávání multimediálního klipu. Když se podíváte do dokumentace, zjistíte že jako parametr dwStyle můžeme použít některý (nebo kombinaci více hodnot) styl specifický pro MCI okno. Můžeme například určit, zda okno má mít vlastní panel s ovládacími prvky (playbar), zda má zobrazovat aktuální pozici v klipu apod. V našem příkladě jsem použil styl MCIWNDF_NOPLAYBAR (bez ovládacího panelu), v kombinaci s klasickými styly okna WS_POPUP a WS_BORDER. Znamená to, že pokud se bude jednat o videoklip, bude tento přehráván v samostatném plovoucím okně (bez toho, aby bylo umístěno na jiném okně jako dětské okno) a navíc bude mít jednoduchý okraj. Přehrávání pak bude možno ovládat pouze z okna aplikace. Samozřejmě můžete experimentovat s různými styly okna. Například není problém přehrávat klip v dětském okně hlavního okna aplikace apod.

Při spuštění dialogu ještě zakážeme tlačítka ovládající klip. Tyto pak budeme povolovat pouze po spuštění přehrávání, kdy naopak zakážeme tlačítko spuštění klipu do té doby, než bude aktuální přehrávání ukončeno. Podívejme se tady jak budeme reagovat na stlačení tlačítka "Přehrát soubor":

BOOL SelectFileDialog(LPTSTR lpFile, HWND hwndOwner)
{
  OPENFILENAME ofn;
  TCHAR szFile[MAX_PATH];
  lstrcpy(szFile, "");
  ZeroMemory(&ofn, sizeof(OPENFILENAME));
  ofn.lStructSize = sizeof(OPENFILENAME);
  ofn.lpstrFile = szFile;
  ofn.hwndOwner = hwndOwner;
  ofn.nMaxFile = sizeof(szFile);
  ofn.lpstrFilter = TEXT("Všechny soubory (*.*)\0*.*\0");
  ofn.nFilterIndex = 1;
  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  if ( !GetOpenFileName(&ofn) )
    return FALSE;
  lstrcpy(lpFile, szFile);
  return TRUE;
}

void OnPlayFile(HWND hwndDlg)
{
  if ( IsWindow(g_hwndMCI) )
  {
    MCIWndStop(g_hwndMCI);
    MCIWndDestroy(g_hwndMCI);
  }
  TCHAR szFile[MAX_PATH];
  if ( !SelectFileDialog(szFile, hwndDlg) )
    return;
  g_hwndMCI = MCIWndCreate(NULL, g_hInst, MCIWNDF_NOPLAYBAR | WS_POPUP | WS_BORDER, szFile);
  MCIWndPlay(g_hwndMCI);
  EnableWindow(GetDlgItem(hwndDlg, IDC_STOP), TRUE);
  EnableWindow(GetDlgItem(hwndDlg, IDC_PAUSE), TRUE);
  EnableWindow(GetDlgItem(hwndDlg, IDC_CONTINUE), TRUE);
  EnableWindow(GetDlgItem(hwndDlg, IDC_PLAY), FALSE);
}

Jak jsem se již zmínil, handle MCI okna můžeme nyní použít jako parametr v široké škále MCI funkcí. Zde si ukážeme ty nejjednodušší. Zastavení přehrávání klipu pomocí makra MCIWndStop a zrušení MCI okna bude vypadat následovně:

void OnStop(HWND hwndDlg)
{
  MCIWndStop(g_hwndMCI);
  MCIWndDestroy(g_hwndMCI);
  EnableWindow(GetDlgItem(hwndDlg, IDC_STOP), FALSE);
  EnableWindow(GetDlgItem(hwndDlg, IDC_PAUSE), FALSE);
  EnableWindow(GetDlgItem(hwndDlg, IDC_CONTINUE), FALSE);
  EnableWindow(GetDlgItem(hwndDlg, IDC_PLAY), TRUE);
}

Podobně pro přerušení přehráváni a pokračování od místa přerušení realizujeme pomocí maker MCIWndPause a MCIWndPlay.

void OnPause(HWND hwndDlg)
{
  if ( IsWindow(g_hwndMCI) )
    MCIWndPause(g_hwndMCI);
}

void OnContinue(HWND hwndDlg)
{
  if ( IsWindow(g_hwndMCI) )
    MCIWndPlay(g_hwndMCI);
}

K dalšímu studiu doporučuji podívat se na přehled maker, funkcí a zpráv začínajících na "MCI". Zjistíte například, jak nastavovat intenzitu zvuku - MCIWndSetVolume, jak upravovat rychlost přehrávání - MCIWndSetSpeed, jak zvětšit či zmenšit obraz videoklipu - MCIWndSetZoom a také jak zachytávat zprávy informující o některých událostech při přehrávání.

Doprovodný projekt je ke stažení zde: win_api_26.zip


Máte připomínku, dotaz nebo komentář k článku a souvisejícími tématy?

Napište a odešlete ji emailem

Copyright © 2019  Radek Chalupa