MPEG作成に関するその他の話題


 単純なMPEG1変換では解決しない問題についてまとめておく。
  1. TMPGEncの設定詳細
     このテキストにまとめ中。
     あるいはこのhtmlファイル

  2. 48kHz wave -> 44.1kHz WAVE変換
     最初はDVD2AVIを使っていたのだが、どうも音が悪い。だいたいTMPGEncでMPEG1変換(MP2)にしたものよりも音が悪い。LinerPCMの場合には48KHzのWavで取れるので、単にビットレート変換すればいいはず。いろいろ試した結果SSRCがまともな音を出すようだ...というわけでこれに決定。GUIも一応存在する。

  3. AC3 -> 48kHz wave変換
     これまたDVD2AVIを考えるがやっぱりだめ。これで48kHz.wavにしてSSRCで44.1kHzにしてみるがおかしい。そもそも48kHz.wavの時点でおかしい。またAC3DECも使ってみたが、どうやらこれはDVD2AVIと傾向はまったくいっしょで使い物にならない。そこで探してみるとどうやらAzidがちゃんと変換でき、かつ使いやすそうである。
     これにはコマンドラインツールとそれを使いやすくするGUIツールとがある。48kHz waveをはくのだが、出力先の設定がうまくいかない。オプションの設定もいまいちだが、変換自体はまともにされる。バッチ変換も可能。44.1kHzが欲しければSSRCで更に変換。

  4. キーが得られない
     SmartRipperを使っていると、時々いつまでたっても終わらないことがある。そのときにはDVDDECを使う。VTS_xx_0にはキー値があるので_1以降もこの値を使うとよいようだ。これでディスク上に元と同じファイル構成を作り上げ、ここからSRで分割すればよい。
     が、バージョンアップして特に問題なくなったように思える。

  5. TMPGEncが突然終了する
     簡単な方法でやっていると終了寸前で突然何のメッセージもなく終了してしまうことがある。どうやら映像と音声との長さが違っているために終了しているのだという、よくわからない説明で済まされているようである。VFAPI経由で音の長さが短いときに発生するという。バッチエンコードをしていたときなどは結構ショックである。なぜか全く手を入れられていない。売り物(PLUS2.50)もこのまま。
     とりあえず回避策を取らねばならない。まずはMPEG2が扱えるくらいの古いバージョン(β12a)を使えばこの現象は起こらない。が、こいつは変換がちょっと遅い。それでも安定して使えるので安心ではあるし、AC3を直接音声ファイルとして指定できたりもする。
     一般的な回避策は映像(m1v)と音(mp2)とを別にエンコードして、合わせる方法である。
    (1)まずは VideoCD (NTSC).mcf を編集し、最初のほうにある次のものをTrue → Falseに変更してロードする。
      MPEG.OutputStreamType_ReadOnly = False
    (2)いつものように映像を指定し、Videoのみにする。出力は〜.m1vになる。エンコードする。
    (3)映像は指定せず音声のみにファイルを指定して、System(Video+Audio)にする。出力は〜.mpgになる。必要ならソースの範囲で音ずれ補正を入れる。エンコードする。映像は必要ないので、最低画質、画面中心に表示にするとちょっとは速い。
    (4)MPEGツールの簡易多重化を使って、できた2ファイル(m1vとmpg(音のみ))をくっつける。その際に形式をMPEG-1 Video-CDにしておく。

  6. TMPGEncがアプリケーションエラーになる
     ac3を食わせているときにアプリケーションエラーになることがある。原因はわからない。仕方ないのでAzidでwavに出してこれをTMPGEncに入れる。だいたい、2.01a自体結構不安定である。

  7. TMPGEncの結果MPEG1がボケた感じになる
     どうもTMPGEncの拡大・縮小でボケが追加されるようである。AviUtlにd2vプロジェクトを入れ、クリッピングで左右方向に16ドット削って704ドットにし、サイズ変更で352*240にし、aupプロジェクトを作り、aupをTMPGEncに入れ、ビデオ詳細で画面中心に表示する(拡大縮小なし)にするとマシなようである。ちなみにAviUtlを使うと盛大にメモリを使用してくれる。200Mバイトとか。

  8. できた結果のMPGがカクカクする
     どうやらDVD2AVIでForce FILMにチェックを入れていたためのもよう。これは24fps化(あるいは24fps化を助ける?)するものだが、ここでやらずにTMPGEncでやったほうがいい。DVD2AVIの他の設定は、iDTCはIEEE-1180、YUV-RGBはPC-Scaleにすべき。他の設定は影響しない。ちなみにYUV-RGBはPC-Scaleでは0-255に、TV-Scaleでは16-235になる。

  9. 白飛び・暗部つぶれする、あるいは色がくすんだ感じになる
     DVD2AVIの「Video」の「RGB->YUV」の設定(「PC Scale」/「TV Scale」)と、TMPGEncのプロジェクトの設定(「設定」ボタン)の「量子化行列」にある「YUVデータをCCIR601ではなく、Basic YCbCrで出力する」のチェックとが食い違っている可能性がある。
     本来は「PC Scale」にして「...CCIR601...」のチェックを外す。
     CCIR601形式、YC伸張なし、TV Scale、16-235とは同様の意味合いになる。またBasic YCbCrと、YC伸張、PC Scale、0-256が対応する。
     MPEGではCCIR601形式で最終データを作る必要がある。TMPGEncでは0-256で入力し、出力時に16-235にされる。が、入力時に既にCCIR601形式(YC伸張なし)で渡されている場合には、更に変換されるために色がくすんだようになって具合が悪い。このようなときにはTMPGEncの設定を変更するとよい。DVソースなどではありがちなんだそうである。
     一方、白飛び・暗部つぶれになるときにはDVD2AVIでTV Scaleにすると、安易に抑えることができる。が、これは本来の使い方ではない。

  10. どうもAviUtlを通すと色がおかしい気がする
     やはりおかしいらしく、0.96i,0.96hは色がずれるという。対策は0.96gを使うこと。素直に0.96gを使おう。0.97aからは問題なくなった...ように思う。

  11. やっぱりボケが気になる
     そういう時にはAviUtlのプラグイン3次補間サイズ変更と低域通過フィルタを使う。かなりましになる。低域通過フィルタでタップを減らす。タップ(参照点)を増やせばぼけるのは当たり前なのだが、減らすと今度はエリアシング(ギザギザ)が気になる。

  12. 元映像から一部を切り取り削除したい
     本当はVobの画像を見ながら範囲指定できればいいのだが、そのようなツールは見つけられなかった。
     単純にはTMPGEncで一部ずつを作成して結合すればよさそうだが、これでは継ぎ目がおかしくなる。こんなカット編集くらいはTMPGEncでできてもよさそうなものだが、なぜか不可のまま。AviUtlでも使っとけという。これだけTMPGEncに編集(画像いじり)機能が盛り込まれ、ソース範囲指定という非常に近い機能がありながらも複数の範囲指定に対応しないのは何なのだろうか。範囲指定を複数指定できるようにし、それぞれの範囲の順番も指定できるようにするだけでいいはずなのだが。

     この手の切り貼りはAviUtlで行う。が、このツールではDVDにありがちな音ずれを簡単には補正できない。
     TMPGEncで音だけを入れたMPEGストリームを作ってAviUtlに音声読み込みでこのMPGを指定してみるが、なぜか切り貼りがうまくいかず変な部分の音が出力されてしまう。
     同様にTMPGEncでd2vとwavを指定して音ずれ補正を入れたプロジェクトを作り、AviUtlで切り取り編集してaupプロジェクトをTMPGEncに入れてエンコードしてみるが、やはり音がおかしい。どうもTMPGEncのVFAPIの渡し方かAviUtlのAFAPIからの入力の問題ではないかと思われる。
     結局のところwavは別のツールで編集する必要がある。-279msならば先頭から279ms分削除する。これをAviUtlの音声読み込みで入れる。で適当に範囲指定して選択範囲の削除を実行する。最後にプロジェクト保存。このプロジェクト(映像と音とが入っている)をTMPGEncに入れてエンコード。この場合にはTMPGEncは異常終了しない。
     音の削除は、この目的には大きなファイルを扱え、最低でもms単位で時間を指定でき、2チャンネルが扱える必要がある。私は昔から使っているツール(DigiOnSoundLight:フリーでない)を使用。これまた大量にメモリを食う。(キャッシュにあてられているようだが)
     このようにしてwavを編集後、AviUtlでd2vを読み込み、音声読み込みでwavを読み込み、範囲指定->削除を行っていく。aupに保存後TMPGEncでエンコード。

  13. 上のやり方でも音がずれる
     上のやり方をしたときにシーンの切り替わりで次の音がわずかながらずれて入ってしまい、ノイズとして残ったりする。1フレーム多く切ればいいのだが、こだわるのなら正確に音ずれを直したくなる。
     調べてみると実はDELAY -236msとか出ているのはそれほど正確ではなく、ちゃんと調べておく必要があるようだ。まあカットせずにエンコードするだけならば1,2フレームくらいならずれてもほとんど気にならないわけだが、20ms〜80ms程度ずれていたりする。60msといえば2フレームであり、1フレーム削ったところでやはり残る。オーディオ波形では表示フレームの表示時間に再生される音が波形表示されているため、29.97fpsでは横いっぱいで33ms程度となる。AviUtlで時間表示をしてこれらを参考にあたりをつけて、カットアンドトライを繰り返す。面倒なら音がかぶるフレームを切ってしまってもいいだろう。

  14. 楽に音の先頭を削除したい
     とりあえず簡単なツールを作ってみた。wavdel.zip(転載不可)。
    WAVDEL FILE1.WAV FILE2.WAV xxx
    として、FILE1.WAVの先頭xxxmsを取り除いたものをFILE2.WAVに出力する。それだけ。作ってみただけで未だ詳しい検証をしていないのだが...この目的以外には使わない方が吉。人の(公開されている)ソースをパクったので、あまり大きな顔はできない。見られたほうはメッセージなどに見覚えがあることだろう。
     (でもこれで楽になるのかは?である。)
     RIFFヘッダがどうたらでfmtチャンクを適当に見て、dataチャンクの始めを適度に削っている。
     その後、wavを削っただけではやはりTMPGEncが異常終了することがあることが発覚。削った後、同サイズを出力wavファイルの後ろに00(無音)で埋める処理を入れた。上でダウンロードできるものも変更している。

  15. AviUtlでシーンチェンジを見つけるのがつらい
     AviUtlで特定のシーンを削除したりしようと思うと、シーンの変わり目を見つけるのが結構大変である。それはフレーム送りと5フレーム送りの他はスライドバーでカタカタずらすしか方法がないからだ。長い映像の時には1ドット動かしただけでかなりのフレーム数を飛んでしまうので微調整ができない。d2vプロジェクトを読み込んでいるとレスポンスはそれほどよくないのでなおさらである。そこで簡単に探す方法を考える。
     TMPGEncには「強制ピクチャタイプを設定する」という名のシーンチェンジ検出機能がある(GOP構造のところ)。これの自動設定で強制Iフレームのリストを作ってセーブし、AviUtlでロードしてみる。リストを作るのは2倍くらいの時間がかかるが手間はかからない。AviUtlではファイルの環境設定のフレーム番号を0からにするチェックを入れておくとよい。で、AviUtlでロードしてみるが、キーフレームは設定されるものの、「次のキーフレームに移動」で次に飛んでくれない。これは機能してないようである。
     Webを探すと「AviUtlプラグイン シーンチェンジ検出」(scenech.auf)を発見。時間は同程度かかるが、AviUtl上で見つけるたびに止められるのでかなり使える。更にTMPGEncでのリストをインポートすればシーンチェンジ検出のBack/Nextでキーフレームの移動が可能になる。やはりAviUtlのメニュー(とツールウインドウ)が機能していないもよう。

  16. それでもやはりシーンチェンジを検出するのに時間がかかる
    そこでキーフレームリストを適当に作る。Excelででも0 100 200 ...という連続した数値を縦に記入し、90000位まで作る。必要ならもっと書く。でテキストファイルに書き出す。結果1行ずつ0 100 200 ...と並んだテキストファイルになる。Excelはこのような規則的なものを書くのが楽だ。
     このファイルをAviUtlのキーフレームリストのロードで読み込む。するとシーンチェンジ検出プラグインのNext/Backで3秒位ずつ送り戻しができるようになる。5フレームしか送れないのよりはずっとまし。

  17. SmartRipperでうまく切れないことがある
     詳細不明。全Titleの全Chapter全Cellを見てもLBA-StartとLBA-Stopがきれいにつながらないことがある。時にはLBA-StartとかLBA-Stopが異常な値だったりする。結果、Vob中の一部が切り出されない。SmartRipperの問題だと思うが、解決策不明。

  18. DVD2AVIで出したAC3とD2Vの長さが合わないことがある
     VOBもAC3もWAVもメディアプレイヤーでは53秒なのに、D2VをAVIUTL等に入れると映像の長さが1:03秒だったりする。実際に再生すると長さが1:03であるが、シークバーは53秒で最後まで行ってしまうことから、切り出したVOBがおかしいようではある。VOB上では最初の10秒ほどが無音なのだが、切り出したAC3もWAVもいきなり音が入っている(本来は10秒後から出る音)ことから、D2Vの処理も怪しい。
     これをTMPGEncにかけると映像が1:03あるのに音が53秒で終わってしまうため、当然(?)異常終了してしまう。
     これも詳細不明。

  19. 字幕を埋め込みたい
     単純に字幕を映像に埋め込んでエンコードする。基本的にはAVIUTLとVOBSUBを使う。VOBSUBはAVIUTLディレクトリにインストールする(DLL/VDFをコピーして拡張子をAUFに変える)。AVIUTLのフィルタ順序でVOBSUBをサイズ変更やクリッピングよりも上の方に移す。
     D2Vを開いた後、AVIUTLの設定->VOBSUB設定のConfigureを開く。ここでOpenでIFOファイルを開く。キャッシュを置くディレクトリを聞いてくるので適当に指定する。Sectionを聞いてくるので00を指定してI've Stripped the ...ボタンを押す。Indexing...が始まるので終わるまで待つ。ConfigureダイアログにIFOファイル名が埋まるので、その右でセクションを選択する。
     字幕は最初のチャプターからのものが出るので、VOBSUBの設定でオフセット時間を大きくマイナスに調整して、これをAVI出力すれば完成。ただし、バッチ処理はできない。

  20. TMPGEncで字幕が出ない。
     上の方法でAVIUTLに入れた後、プロジェクト保存してTMPGEncでエンコードする。が、これではなぜか字幕が出ない。TMPGEncでソースの範囲などで見ても出ないので、AVIUTLでVOBSUBのフィルタがVFAPI出力時に効かないようである。
     仕方ないのでAVIUTLで無圧縮出力後、TMPGEncでエンコードする。VFAPIはこれをやる必要がない点が利点だったはずなのだが...
     これはVobsub2.08だとだめなもよう。2.09を使えば防げる。あるいは1.5x,1.6x辺り。Vobsubの設定でSave setting for next runのチェックを入れておく。ただし、バッチ処理はできない。結局のところ、VobsubがVFAPIにちゃんと対応できていない(対応途上)辺りに問題ありか?

  21. Vobsubでオフセット値を出すのが大変
     SmartRipperでCopy IFO-Fileにチェックを入れて、チャプター1つずつをファイル名を変えながらVobに取る。複数のチャプタにチェックしてまとめて取ってはいけない。結果としてVOBとIFOとがそれぞれチャプター数できることになる。チャプタVobのDVD2AVI後のD2VをAVIUTLで読み、Vobsubの設定時にOpenで対応するIFOを指定すれば、チャプタに対応した字幕が対応した時間で入ってくれる。
     ただし、バッチ処理はやっぱり不可。Vobsubが設定を(レジストリに)1つしか覚えないため、最後の設定のみが反映されてしまう。.IDXのファイル名だけ覚えればいいのだが...

  22. 字幕がボケる
     字幕を入れてクリッピングして352x240(ビデオCDサイズ)に縮小するとなぜか字幕が部分的にボケて調子悪い。字幕を入れるときに余計なことににじませて入れていることが結果的にまずい方向に効いてくるようである。
     が、Vobsubの設定をいろいろいじっていると、字幕がくっきり入り縮小したときにもはっきり出るようになることがある。どうやらSmooth imageにはチェックありとチェックなしの他にグレーでチェックという段階があり、こうすると縮小時にもくっきり出るようである。(フィルタの順番と低域通過フィルタの設定も必要だが)

  23. TMPGEncの使用メモリが異様に多い
     使用メモリ量が実メモリ量を超え、スワップの最大くらいまで費やされるようになってしまうことがある。例えば実メモリは256Mバイトなのに、TMPGEncのメモリ使用量が150Mバイトで仮想メモリ量が900Mバイトとか。
     TMPGEncでは、環境設定の設定のファイルアクセスでOSのファイルキャッシュ機能を使用しない(チェックをつける)、またCPUのマルチスレッドの設定の空き容量をチェックにチェックを入れるとよい。(共にデフォルト値)
     ところが最近、このチェックを入れていてもメモリ容量が異様に増えることがあることに気づいた。環境の変化をいろいろチェックしたところ、AviUtlの97fバージョンではこうなることが判明。97eはaupが使えなくなるバグがあるので、結局は97dを使用することで解決。次のバージョンでは直ることを希望する。
  24. toolameが途中で止まる
     TMPGEncで外部ツールにSSRCやTOOLAMEやGOGO.DLLなどを指定できるが、極まれにtoolameでのMP2変換時に止まってしまうことがある。同じソースだと同じ場所で同じように止まる。止まるだけでなく時にはアプリケーションエラーのときもある。OKや×をクリックして終わらせるとTMPGEncのエンコードになるが、当然音が入らない。
     今までは0.2hを使っていたのだが、0.2i-win32を使うと同じものは通るようになった。とりあえずこれを使っていくことにする。

http://www10.plala.or.jp/p205tb16/video2.html

坂井瑞穂