Windows Media Player(WMV/WMA)形式動画/音声データの検索は現実的にはあまり行われていないのが現状です。この文書はNamazu用のWMV/WMA文書フィルタを実装し、動画検索を実現するまでをまとめたものである。
なお、この研究成果によって作成された文書フィルタのソースコードの利用についてはGPL2ライセンスに基づいた利用とします。このソフトウェアを利用した事による損害、その他の問題について作者は一切の責任を負いませんので予めご了承ください。
当然の事ながら、この文書フィルタは動画ファイルのクリップ情報のみを対象としているため、その情報が欠落しているファイルでは何の情報も得られないため、動画ファイル検索は実現できない。逆に、このフィルタがある事で、動画データ作成時にクリップ情報を入力する事に意味付けができるので、クリップ情報入力を促す動機付けになるものと期待している。 なお、WMV/WMAフォーマットだけでなく、RealMedia形式についてのフィルタも実装しているが、まだ不完全なところがあるため、公開を見合わせている。
まずはじめにWMV/WMAファイルから何を抽出するのかを決定する必要がある。Namazuで検索可能なデータはテキストデータであるので、WMAデータから動画のタイトルなどに関するテキスト情報を抽出することを目標にデータ解析を行う。
SuperTagEditorなどで参照できる項目は
などである。この内、WMV/WMAデータヘッダ部分から簡単に取り出せるのは
である。これらの情報から該当動画ファイルを検索する事は十分可能であると考えられるので、上記情報をターゲットに取得するための文書フィルタを実装する事を目指す。
本来であれば、WindowsMediaSDKを入手してその情報を元に実装するのがスジだが、今回はあえて独自解析によって実装を行った。
これらの抽出対象の文字列は文字コードがUnicode(UTF-16)となっており、抽出した後にエンコーディングを変換する必要がある。プロトタイプではWindows環境のデフォルトエンコーディングShift_JISで出力しているが、Namazuのインデックス化を考えた場合はEUC-JPにした方が良い。しかし、コマンドをWindows上で利用する場合はShift_JISである必要があるので用途によって選択し、文書フィルタ側で対応するなどすればよい。
解析した結果をPythonで簡単に実装した。なお、PythonについてはAppendixで触れる。
以下は実行結果である。抽出した文字列長が2バイトの場合、空欄であると考えられるのでその場合は出力を行わないようにした。現在の実装だと、データ抽出のキーとなる[3&]が見付からない場合、データファイル全体を走査してしまうため効率が良くない。巨大動画ファイルならなおさらである。なんとか、ヘッダの終端を自動的に検出して終了するように変更する予定である。しかしながら、いくつかのファイルをテストしたが、ほとんどの場合、すぐに実行が終了するため現在のところ問題無いと考えても良さそうである。そもそも、ヘッダ位置検索手法に問題があるので、きちんとした方法を実装して頂ける方がいれば大歓迎である。
$ ./wmxinfo.py laure.wma
Title: Laureあいうえお
Author: Triode 48ぴよ
Copyright: Copyright (c) 2000 Microsoft Corporation
Description: とりあえずこのファイルはサンプルみたい。SDKについてたし。
$ ./wmxinfo.py seattle.wmv
Title: Visit Seattle
Author: Windows Media Team
Copyright: 1999, Microsoft Corporation
Description: Two out-of-staters list great reasons to visit \
Seattle.
$ ./wmxinfo.py a2001.wmv
Title: 「A列車で行こう2001」プロモーション
Author: ARTDINK
Copyright: Copyright 2001 ARTDINK.All Rights Reserved.
ちなみに手元のWindowsXP HomeEditionのムービーメーカーで作成したビデオファイルについても問題なく情報が抽出できています。
Windowsでは問題が表面化しなかったのだが、Linux上では全角の波線やハイフンなどの文字はUTF-16からEUC-JPへのコンバートに失敗してしまうので、このような文字を含んでいる場合には代替文字で置き換えるエンコーディングオプションで処理するようにした。これでインデックスに最低限度必要な情報は取り出せるようになる筈である。
WMVのレガシーな形式であるASF拡張子のついたファイルがあるが、wmxinfo.pyはこのファイルに対しても使える。事実上、同じデータ形式であると考えられる。そのため、windowsmedia.pl文書フィルタを対応させた。
Unicode:MapというPerlモジュールを用いてPerlで実装したものもあるが、残念ながら日本語が少し化けてしまうようである。Unicode::Japaneseモジュールを用いても同様であった。原因は不明である。UNIX環境でも全く同様であった。Perl5.8.xではUnicodeが正式サポートされているが、この実装に関してはPythonの実行環境を整備した方が現実的なのでPython版の利用を推奨する。なお、Perl版の実装をして頂ける方のご協力は大歓迎である。
以上の環境でWMV/WMA形式のファイルをインデックス化して検索できる事を確認した。おかしな点があればレポートを頂ければ幸いである。
Pythonの実行環境について説明する。今回の実装環境では以下を利用している。
日本語環境で利用する上でのほとんどの対応を行っているのが特徴の配布系である。
UNIX環境で利用する場合は、
が必要である。Debian GNU/Linuxではどちらもパッケージ化されているのでインストールはapt-getで行える。それ以外のディストリビューションに関しては上記配布ページでRPM形式のものも提供されているのでそちらを利用して欲しい。今回筆者が開発に利用した環境は以下の通りである。