« UtVideoコーデックの入出力形式をまとめてみました | トップページ | 可逆圧縮コーデック「Lagarith」の設定や仕様、使い方等について »

2010年1月29日 (金)

MikuMikuDanceの背景AVI読み込みについて(関連:VFW入力とDirectShow入力)

2011/09/16追記
  2011/2/25にコミットされたffdshow tryouts rev3765で「RGB24出力の削除」という仕様変更があり、
  それ以降のバージョンでは「VFWの設定」を行なっただけでは背景AVIとして読み込めなくなってしまいました。
  コメント欄に詳細や対応方法等を書いたのでご参照ください。

2011/12/06追記
  2011/11/20にコミットされたffdshow tryouts rev4054で、RGB24出力が復活したので
  元通り「VFWの設定」のVFWデコーダーを利用することが可能になりました。

2011/12/17追記
  背景AVIに読み込むための条件に
     「RGB24でデコードできること」
  を明示的に追加。
  ほとんどの場合問題ないが、上に書いたようにffdshow tryoutsのrev3765~rev4053の
  VFWデコーダーを使ってデコードする場合はRGB24出力ができないため読み込めない。
  rev4054以降の使用を推奨。

------------------------------------------------------------------------------

以前、某スレでMikuMikuDanceの背景AVI読み込みについて書いたことがあるのですが、
背景AVIの仕様について作者の樋口様がVFW APIを使っていると発言してらっしゃったようなので、
それを踏まえてまとめなおしてみました。
相変わらず無駄に長いですし、書き込んだ時の内容とあまり変わってませんが、
VFWであることが確定したのでそれを反映し、FLVExtractの例を追加しています。
あと、途中で映像が切れて真っ黒になってしまうケースについても追記しました。

VFW(Video for Windows)とDirectShowの話になりますので、関連する概念を把握しておけば、
NiVEやAviutlなどでのファイル読み込みにも役立つと思います。

 
 ●MikuMikuDanceの背景AVI読み込みで、
    「Craving Explorerの"AVIで保存"で落としたAVIが読み込めない」
    「FLVファイルからFLVExtractで取り出したAVIが読み込めない」
    「読み込んだAVIの映像が途中で真っ黒になってしまう」
   といったトラブルを聞くことがあります。
   今回は、これらのトラブルの原因と対処方法についてまとめてみます。

 ●MMDでは背景AVIの読み込みに
     「VFW(Video for Windows) API」
   という仕組みを使っています。つまり、
     「VFWでデコードできること」
   という条件を満たすAVIファイルでないと、背景AVIとして読み込むことはできません。
   この条件をもう少し細かく言うと、
     1.対応するVFWコーデック(VCMコーデック)がインストールされていること
     2.VFWが扱えるAVI 1.0コンテナのファイルであること
     3.ファイルサイズは2GB以下であること(AVI 1.0の上限)
     4.対応するコーデックがRGB24でデコードできるようになっていること
       (MMDの背景AVI読み込みでは、デコード要求で明示的にRGB24を指定している模様)
   ということになります。

 ●CravingExplorerで"AVIで保存"を行なった場合、保存されるAVIの映像は
   「MS-MPEG4 v2」という映像コーデックで圧縮されています。
   これはMicrosoftの純正コーデックなのですが、少なくとも最近のPC(というかWMP)では
   このコーデックのデコーダは「VFWコーデック」としては提供されておらず、
   「DirectShowフィルタ」としてのみ提供されています。
   そのためデフォルトではVFWでのデコードができず、背景AVIへの読み込みに失敗してしまいます。
   (WMPとかで再生できるのは、DirectShowでデコードして再生しているからですね。
    WMP11を入れてるならMpeg4 Decoder DMOってのがDirectShowデコードに使われます。)

 ●つまり背景AVIとして使うためには、対応するVFWコーデックをインストールすればいいのですが、
   コーデックを個別に入れるのはかなり面倒ですし、入手方法がややこしいものもあります。
   そのため、簡単な解決策として、ffdshow tryoutsのVFW機能を利用するのがよいと思います。
   ffdshowは、「K-Lite Codec Pack」「CCCP(Combined Community Codec Pack)」
   「WECP(Windows Essentials Codec Pack)」などのコーデックパックにも含まれていますが、
   もしかするとコーデックパックによってはVFW機能が利用できないかもしれません。
   正直、個人的にはコーデックパックのインストールはオススメできないので、
   まだ何も入れてない方は「ffdshow tryouts」を単品で入れておくとよいでしょう。
   ただし、ffdshow tryoutsのrev3765~rev4053は、一時的にRGB24出力ができなくなっていたため、
   背景AVIの読み込みには役に立ちません。 必ずrev4054以降を使うようにしましょう。

 ●例えばCraving Explorerの"AVIで保存"で落としたAVIを読み込みたい場合は、
   まず「すべてのプログラム」のところから、ffdshowの「VFWの設定」を開きましょう。
   (「ビデオデコーダーの設定」ではなく「VFWの設定」です。これら2つは設定画面が似ているので要注意。
   「ビデオデコーダーの設定」はDirectShowの設定なので、背景AVIの読み込みでは意味がありません。)
   コーデックパックを使っている人はコーデックパックのサブメニューになってるかも。
   設定画面が開いたら、「Decoder」のタブを開きましょう。
   右側に形式やデコーダーの一覧が出てくるはずです。ここで、「MS-MPEG4 v2」を有効にしてやります。
   ぱっと見どれがそうなのかわかりにくいですが、
   「MS-MPEG4 v2」コーデックを表すFOURCCは"MP42"になります。
   "形式"が「MP42」になっている部分の"デコーダー"欄が「無効」になっていると思うので、
   「無効」の部分をクリックし、「libavcodec」に変更しましょう。これでMP42のVFWデコードが有効になります。
   この状態で「背景AVIの読み込み」を行なえば、問題なく読み込めるようになっているはずです。

 ●FLVファイルからFLVExtractでAVIを作成した場合、そのAVIのFOURCCは"VP6F"になっていると思います。
   これも上と同様に、ffdshowの「VFWの設定」を開いて、"形式"が「VP6F」になっている部分の
   "デコーダー"欄を「libavcodec」に変更することで、VFWでのデコードが可能になります。
   FLVの種類によっては"FLV1"だったりすることもありますが、この場合は"形式"が「FLV1」のところを
   「libavcodec」にしておけばVFWでのデコードが可能になります。

 ●AVIファイルには、大きくわけて
     1.AVI 1.0コンテナのAVIファイル
     2.AVI 2.0コンテナのAVIファイル
   の2種類がありますが、背景AVIの読み込みはVFW APIを使っているため、基本的に
     「2GB制限のあるAVI 1.0コンテナのAVIファイル」
   しか読み込めません。
   AVI 2.0でも、AVI 1.0とある程度の互換性があるので、一見普通に読みこめるように
   見えることがありますが、互換性のない部分は読めません。
   途中から真っ黒になったりするような場合は、コンテナがAVI 2.0になっていないか確認しましょう。
   できればAVI 1.0のファイルに変換して使うとよいと思いますが、2GB制限などもありますので、
   どうしてもAVI 2.0コンテナのファイルをそのまま扱いたい場合は、後述するAvisynthを利用するとよいでしょう。

 ●条件次第では、Avisynthというプログラムを利用することで、
   VFWでは扱えないファイルを読み込めることがあります。
   例えば、
       「VFWコーデックはあるのだけどコンテナがAVI 2.0なので読み込めない」
   という場合には、avsスクリプトでAVISource()を使ってAVIファイルを読み込み、
   そのavsスクリプトファイルを背景AVIとしてMMDに読み込めばOKです。
   Avisynthが備えているAVI 2.0読み込み機能を利用してVFWに渡すという方法ですね。

 ●また、CravingExplorerで落としたAVIのように、
     「VFWではデコードできないけど、DirectShowでのデコードはできる」
   というものであれば、avsスクリプトでDirectShowSource()を使ってAVIを読み込み、
   そのavsスクリプトファイルを背景AVIとしてMMDに読み込めば、
   ffdshow無しでもCravingExplorerのAVIを読み込めます。
   AvisynthのDirectShowデコード機能を利用してVFWに渡すという方法ですね。

 ●なお、背景AVIとして使いたいAVIファイルの、
     「映像コーデックのFOURCCは何なのか」
     「コンテナはAVI 1.0なのかAVI 2.0なのか」
   を調べるには、コーデックチェッカーと呼ばれるソフトを利用します。
   個人的なオススメは、
     「MMName2」
     「真空波動研SuperLite」
   の2つを連携させて使うことです。
   MMName2のメニューで真空波動研との連携設定ができ、その後はAVIファイルを
   MMName2にD&Dするだけで、両方のソフトでの解析結果を一度に見ることができます。
   真空波動研だけだとFOURCCまでわからないこともありますので便利です。

 ●ちなみに、これはVFWとDirectShowの仕組みの基本的な話ですので、
     「NiVEでVFWInputやDSVideoInputを使う場合」
     「AviutlでAVI File ReaderやDirectShow File Readerを使う場合」
   にも同じような概念が適用されます。
   VFWコーデックがあるならVFW経由で読み込めますし、
   DirectShowフィルタしかないならDirectShow経由で読み込むことになります。
   (Aviutlの場合はプラグイン優先度の設定なども影響しますが。)

===============
  まとめ
===============

 ■MMDの背景AVI読み込みについてのまとめ

   ●AVIファイルを、MMDの背景AVIとして読み込むには、以下の条件を満たす必要があります。
       1.対応するVFWコーデック(VCMコーデック)がインストールされていること
       2.VFWが扱えるAVI 1.0コンテナのファイルであること(AVI 2.0は駄目)
       3.ファイルサイズは2GB以下であること(AVI 1.0の上限)
       4.対応するVFWコーデックがRGB24でデコードできること
         (ffdshow tryoutsのrev3765~rev4053は使わず、rev4054以降を使用すること)

   ●まずは「MMName2」「真空波動研SuperLite」などを使って、
     背景AVIとして使いたいAVIファイルのコンテナや映像コーデックの種類を調べましょう。

   ●調べた結果に応じて、以下のいずれかの方法で対処してみましょう。

      方法1.対応するVFWコーデック(VCMコーデック)を入れる

      方法2.ffdshow tryoutsをインストールし、「VFWの設定」で対応するVFWコーデックを有効にする

      方法3.AvisynthのAVISource()やDirectShowSource()を使ってavsファイルを作り、
           そのavsファイルを背景AVIとして読み込む

      方法4.AviutlやVirtualDubModなどを使い、読めないAVIを別のコーデックで再エンコードして使う

|

« UtVideoコーデックの入出力形式をまとめてみました | トップページ | 可逆圧縮コーデック「Lagarith」の設定や仕様、使い方等について »

コメント

最近、MMDを触り始めたばかりのものです。
AVIファイルのコーデック等分かりやすくて、大変助かりました。
ありがとうございます

投稿: | 2010年2月11日 (木) 13時59分

背景にAVIを表示できました。
ありがとうございます。

投稿: | 2010年4月11日 (日) 20時04分

「Craving Explorerの"AVIで保存"で落としたAVIが読み込めない」
ffdshowインストール 「VFWの設定」MP42「libavcodec」ok
AVI 1.0 ファイルサイズ98.0 MB
・・・読み込めません;;何故ですか・・・orz

投稿: | 2011年5月12日 (木) 20時58分

背景、読み込めません。
ffdshow tryoutsをインストールし、コーデックを有効にしようとしたところすでに有効。
CravingExplorerでAVIで保存を行ない、 映像コーデックのFOURCCはMP42/MP42とのこと。
コンテナはAVI 1.0を確認。26.8 MB。
AvisynthをダウンロードしAVISourceでやろうとしましたがやり方がなにをみてもわかりませんでした。
PCにはあまり詳しくないので、手詰まり状態です。かれこれ何時間も格闘してるので、ご教授きただけるとありがたいです。

投稿: | 2011年5月24日 (火) 01時43分

ブログ放置しており質問に気づかずすみませんでした。
4ヶ月もたってしまいましたが回答いたします。

■ffdshow tryoutsの「VFWの設定」の「MP42」にしたのにCravingExplorerのAVI 1.0が背景AVIに読み込めない件

  こちらでも再現したので調査しました。その結果、
     「2011/2/25にコミットされたffdshow tryoutsのrev3765で
         "いくつかの出力色空間の削除"
      という仕様変更があり、RGB24での出力ができなくなったため、それ以降のバージョンを使って
      VFWデコードの設定をしても、それだけでは背景AVIとして読み込むことができなくなった。」
  ということが判明しました。
  MMDの背景AVIの読み込みではRGB24でのデコードを要求するらしく、それが原因で読み込みに失敗するようです。
  (rev3765以前のバージョンでもffdshow tryoutsの出力設定でRGB24をオフにすると読み込めなくなりますし。)
  これはCravingExplorerのMP42に限らず、上に書いたFLV ExtractのVP6Fなども含め、
  ffdshow tryoutsのVFWでデコードするもの全てに当てはまります。

  なお、NiVEのVFWInputはRGB32でデコードをするので大丈夫ですし、
  AviUtlの「AVI/AVI2 File Reader」でもYUY2やRGB32で読み込むので問題ありません。
  ただしAviUtlの「AVI File Reader(Video For Windows)」では背景AVIと同様にRGB24でのデコードを求めるようで、
  これの優先度が「AVI/AVI2 File Reader」より上になっていると読み込めません。

  さて、解決策ですが、
     ・記事最後にある方法3(Avisynth使用)を使う
     ・記事最後にある方法4(別のコーデックで再エンコード)を使う
     ・rev3765より前のffdshow tryoutsを使う
     ・MMDの背景AVI読み込み機能がRGB32などでデコードできるようになるのを待つ?
  のいずれかになると思います。
  ffdshow tryoutsはバグ修正や機能追加などで更新を続けているので、個人的には方法3か方法4をお勧めします。
  どの方法を使うにせよ、デコードはffdshow tryoutsのVFWを利用するといいと思うので、
  「VFWの設定」の「MP42」は「libavcodec」にしておいてください。

■AvisynthのAVISource()を利用して背景AVIを読み込む方法の詳細

  1.ffdshow tryoutsの「VFWの設定」で「MP42」を「libavcodec」にし、MP42をデコードできるようにしておきます。
  2.Avisynthをインストールします。(参考:http://www.avisynth.info)
  3.メモ帳で
      AVISource("D:\Video\Craving.avi")
      ConvertToRGB24()
    という2行を書いたテキストファイルを作成し、拡張子を「.avs」にして保存します。
    例えば「test.avs」という名前で保存します。
    AVISource()の引数には、読み込みたいAVIファイルをフルパスで指定します。
    (ffdshowを利用したくない場合はAVISource()ではなくDirectShowSource()を使ってもよいです。)
  4.MMDを起動し、「背景AVIの読み込み」を実行します。
    デフォルトではAVIファイルのみしか選択できませんが、ファイル選択ダイアログで
    「ファイルの種類」のところを「All Files(*.*)」にすると、avsファイルも表示されますので、
    3で保存したavsファイル(ここではtest.avs)を選択します。
  5.これで、目的のAVIの映像が背景AVIとして読み込まれるはずです。

  Avisynthの導入などについては、以前作成した動画でも少し解説していますので、こちらも参考になるかもしれません。
  動画の最後に解説しているAvsPなども利用すると便利です。
     【MMDとか色々】AvisynthのMVTools(MFlowBlur)でお手軽綺麗なモーションブラー
     http://www.nicovideo.jp/watch/sm7559724

投稿: 金の髭 | 2011年9月16日 (金) 03時14分

ffdshow tryoutsは64bit版だと駄目かもしれません。
私は32bit版にしたら読み込めました。
同じ所で詰まってる方居たら、参考までに。

投稿: | 2012年4月11日 (水) 07時43分

↑64bitで駄目な人はMMM使ったほうが手っ取り早いかも

投稿: y | 2013年1月 6日 (日) 11時48分

一応、ちゃんと使えているようなので、
記事の方法でうまく行かない人のための代替手段として宣伝を

mp4をMMDの背景aviにそのまま使うためのバッチ
http://bowlroll.net/up/dl10144

mp4をMMD64bit版の背景aviに使うためのバッチ
http://bowlroll.net/up/dl10199

mp4をUt Videoなaviに変換するバッチ
http://bowlroll.net/up/dl10226

投稿: こ~りん | 2013年4月23日 (火) 21時32分

Craving ExploreでDLしたのが読み込めなかったのですが、
aviutlにL-SMASH Works を落として、AVIを出力しなおしたら解決しました。
nicovideo.jp/watch/sm24806762にL-SMASH Worksの設定とか詳しいです。

投稿: | 2015年8月25日 (火) 15時11分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1278146/33165264

この記事へのトラックバック一覧です: MikuMikuDanceの背景AVI読み込みについて(関連:VFW入力とDirectShow入力):

« UtVideoコーデックの入出力形式をまとめてみました | トップページ | 可逆圧縮コーデック「Lagarith」の設定や仕様、使い方等について »