このページはNetscapeNavigator 2.0以降及びMicrosoft Internet Exploler 3.0以降で正常に見られます。
Solly,Japanese only

★ BB研究所 ★
MCIによる動画再生
 VBプログラマやDelphiプログラマの方には申し訳ありませんが、このページも例によって、VC++(C言語)プログラマを前提にしています。また、Windows95を前提に解説いたします。

 MCI(Multimedia Control Interface)とは、マルチメディアのコントロールインタフェースです。これは、その昔Microsoft社がApple社のQickTimeに対抗して、 開発したもので、その後QTWやその他のマルチメディアドライバも、MCIからアクセスできるようになったため、機能は少ないながら、現在一番手軽なマルチメディアドライバへのアクセス方法となっています。
 ちなみに、Microsoft社はその後、ActiveMovieやNetShowといった更に強力なマルチメディアドライバを作り、IEやOSにバンドルしましたが、これらも、互換を保つためにMCIサポートしています(もっとも、MPEG4に盛り込まれるなど、QickTimeに軍配が上がりつつあるようですが・・・)。
 MCIは、どちらかというと有名な技術で解説本も多いのですが、拙作ヴィデオ・スクリーンでも使用していることから、今回扱うことにしました。
 ここでは、このMCIによる動画再生について簡単なサンプルを交えながら解説いたします。
※MCIはWAV,MIDI等オーディオも扱えますがここでは特に触れません


1.必要な環境

 MCIコマンドを使用出来るようにするには、MCI用のヘッダファイル(MMSYSTEM.H)をインクルードし、ライブラリ(WINMM.LIB)をリンクする必要があります。これらは、標準のVC++に添付されています。
 VC++5.0では、MCIプロジェクトを作成したときに「プロジェクト(P)」→「設定(S)」を選び、「リンク」の「オブジェクト/ライブラリ・モジュール」に、「WINMM.LIB」を追加して下さい。そして、
をソースへ追加して下さい。


2.mciSendStringとmciSendCommand

 MCIコマンドには、文字列で命令を与える方法と、数値や構造体で命令を与える方法の2種類があり、それぞれmciSendStringとmciSendCommandを用います。
 mciSendStringは以下の書式で呼び出します。
 また、mciSendCommandは以下の書式で呼び出します。

3.MCIデバイス一覧表示ソフト

それでは、まず簡単なMCIストリングを使った方法で、システムに登録されているMCIデバイスの一覧を表示させるサンプルソフトを作成します。
システム一覧は"sysinfo"コマンドを使用します。数を取得するにはオプションに"all quantity"を指定し、各デバイス名は"all devname 番号"で指定します。
それでは、コンソールアプリで、以下のソースを作成し、ビルトして下さい。このとき、「WINMM.LIB」のリンクも忘れないで下さい。
#include	<stdio.h>
#include	<windows.h>
#include	<mmsystem.h>


void main()
{
	char szReturnString[500];
	char szSendString[500];
	long lNumOfDevice,l;

	printf("登録MCIデバイス表示ソフト\n");

	// MCIデバイス数の取得
	if(mciSendString("Sysinfo all quantity",szReturnString,sizeof(szReturnString),NULL)!=0){
		fprintf(stderr,"MCIにエラー発生\n");
		exit(-1);
	}
	lNumOfDevice=atoi(szReturnString);

	// 一覧の作成
	for(l=1;l<=lNumOfDevice;l++){
		wsprintf(szSendString,"sysinfo all name %d",l);
		mciSendString(szSendString,szReturnString,sizeof(szReturnString),NULL);
		printf("MCI Device(%d):%s\n",l,szReturnString);
	}

	exit(0);
}

実行例を以下に示します。

D:\ito\Src\MciQuery\Debug>mciquery  
登録MCIデバイス表示ソフト
MCI Device(1):LiveAudioFile
MCI Device(2):LiveAudioMetafile
MCI Device(3):QTWVideo
MCI Device(4):MPEGVideo
MCI Device(5):avivideo
MCI Device(6):waveaudio
MCI Device(7):sequencer
MCI Device(8):cdaudio

D:\ito\Src\MciQuery\Debug>

上記の例では、(1)(2)がLiveAudio、(3)がQTW(Qick Time for Windows)、(4)がActiveMovie、(5)がVFW(Video for Windows)です。


4.処理の流れ

ここでは、MCIデバイスに対する一般的な処理の流れを取り上げます。
処理の流れは、mciSendString/mciSendCommandともに同じで以下のようになります。 通常、アプリケーション起動時又はユーザによるファイルオープン時に、openを実行し、アプリケーションの終了又は他のファイルのオープン前にcloseを行います。playとstopは、ユーザによるイベントにより実行します。 以下の章で、各コマンドについて説明します。


5.open

openは、再生したい動画ファイル(=コンテンツ(contents)番組内容)を開きます。このとき、 mciSendString系ではエリアス(別名:下記例では"mcitest")を付けます。closeまでの間、このエリアスに対して各種コマンドを発行できます。mciSendCommandではエリアスを指定する代わりに、open時にデバイスIDが戻されます。
それぞれの書式は、以下の通り。


6.play


7.stop


8.close


9.サンプル

上記説明だけでは、具体的な操作がわかりにくいと思いますので、参考にopen/play/stop/closeを使用した簡単なサンプルプログラムを作成しました。これをみることで、操作法についてはある程度理解できると思います。
mciSendStringコマンド系を使用しています。MFCのダイアログで作成しました。
ソースのほとんどは、ウィザードが自動生成したものです。このスケルトンに対し、リソースとMCI_StrDlg.c/MCI_StrDlg.hに変更を加えました。変更箇所は「追加 byBB」とコメントしているのでわかると思います。
ソースはここからダウンロードして下さい。
オブジェクトとプロジェクトをLHA圧縮してあります。尚、使用ツールは、VC++ v5.0 Proffessinalです。


おわりに

MCIは比較的簡単ではありますが、それでも上記以外にかなり豊富な機能を持っています。今回作成したサンプルは、実用にはなりません。最低でもエラー処理とseekは要るでしょう。また、子ウィンドウに表示させるためにはそのウィンドウのウィンドウハンドルを取得して、拡大/縮小させる等の技術が必要になります。ここら辺は実際に作ってみると良いでしょう。最後にアドバイスですが、MCIには各社のマルチメディアデバイスがありますので、一つだけではなくなるべく多くのデバイスに対して、作ったアプリケーションのテストをする必要があります。デバイスによって動きが異なってきます。


[ホームへ戻る]


Copyright (c) 1997-1999, BearBeetle, Allrights reserved.