AVIの読み取り映像と音声を格納したAVIファイルは、RIFF形式を採用しています。映像や音声に関する情報を取得することができます。Windows)のAVIFile関数が使用されています。データが分割されて格納されているからであると思われます。次に、AVIファイルのチャンク構造を示します。RIFFチャンクの中には、LISTチャンクが2つ存在します。片方のチャンクのリストタイプはmoviです。avihチャンクにはMainAVIHeader構造体が格納されています。片方が映像の情報を格納し、もう片方が音声の情報を格納しています。内部に存在するチャンクのID(strhなど)は両者共通となっています。リストタイプがmoviであるリストチャンクには、映像データと音声データが格納されています。00dcチャンクは1つの映像データを表し、このチャンクは映像の数だけ存在します。01wbチャンクは1秒間に音声データを表し、このチャンクは秒の数だけ存在します。オーディオストリームのデータを格納するチャンクは01となります。これが無圧縮のDIBデータであるばらば、dbという文字列になります。MP3のような圧縮されたデータが格納されている場合もwbとなります。この構造体が単一で格納されているわけではない点には注意してください。MP3による圧縮ならばMPEGLAYER3WAVEFORMAT構造体が格納されています。当然ながらそれらを格納するチャンクのチャンクIDを理解しておく必要があります。コードも複雑になってしまいます。できる限りこれらの関数を使用した方がよいと思われます。これらの構造体が必要な場合はマルチメディアファイル入出力関数を呼び出すことになります。今回のプログラムは、AVIファイルに格納されている各種構造体を取得し、そのメンバの値を表示します。vfw.hをインクルードしています。TEXT("ファイルのオープンに失敗しました。TEXT("AVIファイルではありません。TRUE;}自作関数のGetAviHeaderは、マルチメディアファイル入出力関数を使用してMainAVIHeader構造体を取得します。それぞれのフォーマットも取得します。重要な部分を順に見ていきます。TEXT("AVIファイルではありません。mmioDescendにMMIO_FINDRIFFを指定します。フォームタイプにはAVIファイルであることを示すformtypeAVIを指定します。続いて、LISTチャンクにデイセンドするため、mmioDescendにMMIO_FINDLISTを指定します。このチャンクのリストタイプはhdrlであるため、それを示すlisttypeAVIHEADERを指定します。LISTチャンクの下には、avihチャンクが存在します。0);}チャンクIDにavihを示すckidAVIMAINHDRを指定し、mmioDescendを呼び出します。MMIO_FINDCHUNKを指定しています。デイセンドに成功したら、mmioReadでMainAVIHeader構造体のデータを読み取ることができます。現在のavihチャンクからアセンドします。AVIStreamHeader構造体は、リストタイプstrlのLISTチャンクに存在しています。これは、ビデオストリームとオーディオストリーム共に共通します。ビデオストリーム用とオーディオストリーム用でそれぞれ呼び出すことにしています。GetStreamHeaderの内部は、次のようになっています。0);}まず、strlを示すlisttypeSTREAMHEADERを指定してLISTチャンクにディセンドします。ckidSTREAMHEADERを指定してこのチャンクへディセンドし、mmioReadでデータを読み取ります。ckidSTREAMFORMATを指定してstrfチャンクへディセンドします。