一部のYUVなaviを、MikuMikuDanceが背景AVIとして正常に読み込めない問題
@Higuchi_U @umezawa_takeshi ともかく、確実に読めるRGBを読ませる、ということは了解です。読み込みについての技術的な話は梅澤さんにお任せします
2014-10-26 22:11:49820 名前:名無しさん@編集中[sage] 投稿日:2014/10/26(日) 22:46:45.99 ID:gMc7tIdI
http://peace.2ch.net/test/read.cgi/avi/1247236230/820
>>817-819
>>814-816です。ありがとうございます。色々試していてレスが遅れてしまいました。すみません。
ようやく整理できた気がしますが、まず、こちらで試してわかったことをいくつか。
●Xvid-1.3.3-20140407を入れていると、YV12のデコードが阻害されてしまう。
(他のバージョンは確認していません)
>>817さんは
>ff_vfwの設定をすれば「無圧縮のyv12」ならMMDでも再生できるようになった
とありましたが、うちではffdshowの「VFWの設定→Decoder→コーデック→Raw video」で
「YV12」「全YUV形式」「全サポート形式」を選んでも、YV12無圧縮のAVIをMMDの背景AVIに
正常に読み込めず、真っ黒になってしまっていました。
(なお、YV12無圧縮のAVIは、AvsPModでConvertToYV12()をしたavsを読み込み、
「Tools→Script encoder(VFW)」で、「再圧縮なし」で出力したものです。)
この違いが不可解で色々試していたところ、VirtualDubModでYV12のAVIを開いて「File information」を見ると、
>>814にも書いた
ttp://freesoft.tvbok.com/movie_encode/virtualdubmod/yv12avs.html
の記事のスクショにもあるように、「Xvid MPEG-4 Codec」がデコーダとして選ばれており、シークすると
Error decompressing video frame 1: The source image format is not acceptable. (error code -2)
のようにデコードエラーを起こしていました。
そこで、Xvid 1.3.3をアンインストールしてみたところ、ffdshowのVFW設定が効くようになり、
「Raw video」で「YV12」「全YUV型」「全サポート形式」を選んでいれば、VirtualDubModでも
MMDの背景AVI読み込みでも、YV12無圧縮のAVIが正常に読み込めるようになりました。
つまり、Xvid 1.3.3が中途半端にしゃしゃりでてYV12をデコードしようとして失敗していたというわけですね・・・。
また、Xvid 1.3.3をアンインストールしたことでffdshowのYV12デコードが有効になったため、
ULY0、ULH0のAVIも、ffdshowをちゃんと設定すればMMDの背景AVIとして問題なく読み込めるようになりました。
822 名前:名無しさん@編集中[sage] 投稿日:2014/10/26(日) 22:58:16.13 ID:gMc7tIdI
http://peace.2ch.net/test/read.cgi/avi/1247236230/822
MMDの背景AVIでULH2/ULY0/ULH0が真っ黒になることがある件の推測。
1.MMDの背景AVI読み込みはVFWで、正常に扱えるのはRGB24のみ。
2.普通はコーデックとネゴシエーションを行い、RGB24しか受け入れられないなら、
コーデックからRGB24でデータをもらえばいい。
しかし、MMDの背景AVI読み込みはこの部分の処理に問題があり、
コーデック側が提示した形式を無条件で受け入れてしまう(?)。
3.UtVideoの場合、入出力フォーマットはREADME参照。
ttp://umezawa.dyndns.info/archive/utvideo/utvideo-14.2.1-readme.ja.html
ULY0はYUY2、ULH2はHDYC、ULY0/ULH0はYV12が最も優先度が高い。
ネゴシエーションに問題のあるMMDの背景AVI読み込みでは、
UtVideoはこれらのフォーマットで出力を行おうとする(?)。
4.MMD側では、YUY2やHDYC、YV12はそのままでは読み込めない。
だがYUY2やHDYC、YV12をRGB24にデコードできるVCMコーデックが入っていれば、
それらがRGB24に変換し、正常に読み込むことができる(ようだ)。
入っていなかった場合は正常に読み込めず、真っ黒になってしまう。
5.YUY2はWindows標準のmsyuv.dllでサポートされているため、ULY2は問題ない。
YV12やHDYCはWindows標準ではサポートされない(※注1)ため、対応するVCMコーデックが必要。
YV12はffdshow(※注2)、HDYCはBlackmagic DesktopVideo。
これらを入れれば、ULY0/ULH0/ULH2もMMDの背景AVIとして正常に読み込めるようになる。
(ただ、MMDの背景AVI読み込みのためだけにこれらを入れる必要は無い。別のコーデックを使えばよいだけ。)
※注1: Windows8.1でサポートされていないのは確認。その他は不明。
※注2: ffdshowの場合「VFWの設定→Decoder→コーデック→Raw video」で「YV12」か「全YUV形式」「全サポート形式」を選択。
DivXもYV12デコーダーを持つが、既に更新が停止されている上、32bit版しか無いのでx64版MMDでは役に立たない。
Xvidは、Xvid-1.3.3-20140407を入れると正常にYV12デコードができず、ffdshowの邪魔をするだけとなるので使えない。
821 名前:名無しさん@編集中[sage] 投稿日:2014/10/26(日) 22:49:21.75 ID:gMc7tIdI
http://peace.2ch.net/test/read.cgi/avi/1247236230/821
●DivXにも一応YV12 Decoderがついている(今更DivXを使う必要もないのであまり推奨しない)
DivXは10.2からDivXコーデックパックを外してしまいましたが、こちらの記事で最終版が配布されています。
DivX 10.2: Removing Codec Pack | DivX Blog
http://blog.divx.com/2014/04/23/codec-pack/
末尾にある2014/8/18追記のところの「~download it 【here】」のところです。
bit.lyからの警告が出ますが、それを無視すればダウンロード可能。
インストール時にノートン先生が反応しますが、これは「RegClean Pro」という迷惑ソフトを入れようとするため。
途中で拒否できるので絶対に拒否する必要があります。うっかり入れないように。
インストールされるDivXコーデックは、
DivX 6.9.2 Codec 06_09_02_00026_VfwCodec
ビルト オン Feb 19 2010 @ 11:26:13
となっています。これには
DivX 6.9.2 YV12 Decoder
が入っていますので、これでもYV12デコードができるようになります。(ffdshowより優先して使われます)
ただし32bit版だけですので、64bitアプリでのYV12デコードはできません。
●VirtualDubとVirtuaDubMod
VirtalDubでは、「Internal DIB decoder」が内蔵されており、
YV12などの各種非圧縮フォーマットを自前でデコードできるようになっています。
入出力色空間なども>>818さんが言われているように色々設定でき、
VCMのYV12デコーダーなどは必要としません。
VirtualDubModの方は、入出力がRGBに限られているようです。
そのため、YV12などを読み込むためには、別途対応するVCMのデコーダーが必要になります。
試しにYV12無圧縮のAVIファイルを読み込ませてみると、YV12デコーダーの有無を判定できます。
エラーが出ればYV12デコーダーが入っていないということ。
エラーが出なかった場合は、「File→File Information」を開いて「Decompressor」を見れば、
使われているYV12デコーダーがわかります。(ただしVirtualDubModは32bit版しかありません)
823 名前:名無しさん@編集中[sage] 投稿日:2014/10/26(日) 23:52:32.20 ID:gMc7tIdI
http://peace.2ch.net/test/read.cgi/avi/1247236230/823
追記:
Lagarithでも、YV12で圧縮したならYV12で出力しようとするので、>>822のULY0/ULH0と同様に
MMDの背景AVI読み込みでは、YV12デコーダーが入っていないと真っ黒になります。
Lagarithの設定の「Always Suggest RGB for Output」にチェックを入れておくと、
YV12で出力するのではなくRGBで出力するようになるので正常に読み込めるようです。
余談ですが、MMDv9.24のx64版でLagarithのYUY2で圧縮したAVIを読ませると、
lagarith.dllでエラーが起きてMMDごと強制終了となります。(うちの環境だけかもしれませんが)
824 名前:名無しさん@編集中[sage] 投稿日:2014/10/26(日) 23:57:19.22 ID:gMc7tIdI
http://peace.2ch.net/test/read.cgi/avi/1247236230/824
更に余談ですが、テストの過程で、
「無圧縮のYUV系AVIをMediaFoundationで再生すると、解像度や色がおかしく見える」
ということに気づきました。
Windows8.1環境で、YUY2やYV12無圧縮のAVIをWindowsMediaPlayerで再生するか、
QonohaでMediaFoundationを優先する設定にして再生すると、以下の画像のようになってしまいます。
ttp://2sen.dip.jp/cgi-bin/upgun/up1/source/up0838.png
なおtopoEditは以下のようになっています。
http://2sen.dip.jp/cgi-bin/upgun/up1/source/up0839.jpg
何が起きているかはよくわからないのですが、豆知識的な情報として貼っておきます。
825 名前:名無しさん@編集中[sage] 投稿日:2014/10/26(日) 23:59:44.54 ID:gMc7tIdI
http://peace.2ch.net/test/read.cgi/avi/1247236230/825
よく見ると色は特に問題ないのかな・・・
826 名前:名無しさん@編集中[sage] 投稿日:2014/10/27(月) 01:58:33.77 ID:MXSxCZf3
http://peace.2ch.net/test/read.cgi/avi/1247236230/826
>>815で書いた
>2.背景AVI読み込みでMMDが強制終了することもあったのでイベントビューアを見てみると、
> DxtoryCodec.dllで障害が発生していた。やむをえずDxtoryをアンインストール。
> (入れていたのはDxtory 2.0.128か126。)
についても、条件と原因を整理しました。発生するのは
・Dxtory(2.0.128で確認)をインストールしており、
・x64のYV12やHDYCのデコーダが存在しない場合に
・MMDのx64版で
・ULY0/ULH0/ULH2やLagarithのYV12など、YV12やHDYCを優先するコーデックのAVIを読ませた場合
です。
他にYV12やHDYCのデコーダーが無い場合に、なぜかDxtory Video Decoderが、
それらのデコードを行おうとして失敗するのが原因のようです。
試しにVirtualDubModでYV12のAVIを読ませてみると、DecompressorがDxtory Video Decoderになっており、
VideoSourceAVI error: An unknown error occurred (may be corrupt data). (error code -100)
というデコードエラーが発生しています。
x86版MMDであれば真っ黒になるだけで済みますが、x64版MMDだと強制終了につながるようです。
なお、ffdshow(x64版)のVFW設定でYV12デコードを有効にしておけば、そちらが優先されるため、
x64版MMDでのDxtoryCodec.dllによる強制終了は発生しなくなります。
(ULH2はHDYCなのでBlackmagicDesign DesktopVideoを入れないと駄目ですが)
なおffdshow rev4533のx64版では、VFWコーデック(要注意警告あり)を有効にしてインストールしても
「VFWの設定」のショートカットが作られず、そのままではVFWの設定が開けないようです。
ただし、VirtualDubのx64版があれば、「Video→Compression→ffdshow Video Codec→Configure」で
x64版ffdshowのVFWの設定画面を開くことが可能です。
ただ、これでYV12デコードを有効にしても、x64版MMDではULY0/ULH0やLagarithYV12が正常に読めるようになるだけで、
YV12無圧縮のAVIは「AVIファイルを読み込めません」となるようです。
x86版の場合はYV12無圧縮のAVIも正常に読み込めるようになるのですが、x64版だとなぜか駄目です。
827 名前:名無しさん@編集中[sage] 投稿日:2014/10/27(月) 02:47:03.25 ID:MXSxCZf3
http://peace.2ch.net/test/read.cgi/avi/1247236230/827
なお、>>822のMMDの背景AVI問題についてですが、読めない理由が気になっているだけであり、
基本的には「MMDが普通に読めるコーデックで背景AVIを作って読ませればいいだけ」だとは思っています。
ただ、UtVideoにしてもLagarithにしても、RGBでの出力機能はもっているので、
MMD側の背景AVI読み込み処理を改善すれば、YV12やHDYCのデコーダーが無くても
普通に読めるようになるのではないかという推測はしています。
ただ、実装や仕組みの詳細は私にはわかりませんし、改善の余地がありそうというだけです。
VFWのプログラミング知識があればよかったのですが・・・orz
ここで書くのもあれですが、本件についてツイッターでご協力いただいた方も、ありがとうございました。
長々とすみません。