引き続き、AVIファイル作成についてです。Windowsでプロパティ表示すらできなかった問題が解決。もちろん、再生もできるようになりました。ファイルにidx1リストを追加して、インデックス情報を与えてやったことで問題解決です。idx1は古いインデックス方式ですが、AVIファイルのリファレンスではオプションとされていたので不必要だろうと思っていました。ところが、Windowsでは必要なようです。結果として、作成するAVIファイルの構造は次のようになりました。
AVIファイルの構造については、検索すればいくらでも説明がみつかりますので、できるだけ手抜きしてMotion JPEGファイルを作るための要点ということで整理しておきます。
自分の環境の都合上、MacOS上のQuickTime XならびにWindows 7上のMedia Playerで再生できることしか確認していません。他のプレーヤでは正しく再生できないことがあるかもしれません。
続いてSAM3Sにこのコードを移植する作業に入ります。
RIFF ('AVI ' LIST ('hdrl' 'avih'(<Main AVI Header>) LIST ('strl' 'strh'(<Stream header>) 'strf'(<Stream format>) ) ) LIST ('movi' 'dc00' (<JPEG data>) 'dc00' (<JPEG data>) ... 'dc00' (<JPEG data>) ) 'idx1' (<AVI Index>) )
AVIファイルの構造については、検索すればいくらでも説明がみつかりますので、できるだけ手抜きしてMotion JPEGファイルを作るための要点ということで整理しておきます。
- OpenDMLに従わなくても再生できるAVIファイルを作成できるが、idx1リストがないとWindows環境ではプロパティも表示できない。
- 製作中のカメラはマイクを持たないので、動画データには圧縮画像データだけが含まれ、音声データは無い。そのため、AVI headerにおいて dwStrems=1に設定。movi listにおいては、’00dc'のデータチャンクだけが含まれる。
- Motion JPEGであることを示すために、strhのfccHandlerを'mjpg'に設定。また、strf中のbmiHeader.biCompressionで'MJPG'を指定する。
- '00dc'のデータチャンクはワード境界に配置する。
- OpenDMLのドキュメントを読むと,
MS DIB spec
とかいう仕様で、「JPEGデータ部分では、SOIに続いてAPP0セグメントが配置され、その最初の4バイトを'AVI1'にする」というお約束があるらしい。試したところではAPP0で'JFIF'でも大丈夫だったし、APP0の代わりにAPP1のExifが入っていても再生できた。
自分の環境の都合上、MacOS上のQuickTime XならびにWindows 7上のMedia Playerで再生できることしか確認していません。他のプレーヤでは正しく再生できないことがあるかもしれません。
続いてSAM3Sにこのコードを移植する作業に入ります。
もし良ければ最小のaviサンプルを頂けませんか。
モーションJPEGを作るのに参考にさせて貰えればなと。
そのうちに調査しなおして、修正しようと思いつつも手つかずとなっております。