6 : 18 [OGM] 字幕の行末が脱落する

← 6‒17 p↑ もくじ i 6‒19 n →

OGG/OGM動画の再編集、OGM→AVI変換

2002年11月 5日
記事ID d21105

OGM→AVIの変換法。 GraphEdit を使った上級者向けの方法です。 VirtualDubMod を使ったより一般向けの方法については、別記事「VirtualDubModを使ったOGM→AVI変換」をごらんください。

初めに

「OGM は WMV同様、再編集がしにくい」という誤解があるようですが、 VirtualDubMod(OGMサポートのあるVdub)で開けば、 ノーマル版Vdubでできそうなことは、すべてできますし(save as AVI / save as WAV も含めて)、 以下で説明するように、OGM→Ogg音声+XviD動画+SRT字幕スクリプトへの逆変換というか分解(Demux)も単純作業です。 中間ファイルを介さずに、一気に OGM を音声MP3のAVIに変換することも可能。(以下は Windows 2000 で動作確認)

OGM の単純な Demux

単純な Demux であれば、OGMDemuxer を使うのが軽快と思います。 例えば、ビデオストリーム1、OGGオーディオ1、SRTサブスクリプト1の3つがMuxされている test.ogm があったとして、
OGMDemuxer -a -p test.ogm
とタイプすれば、

  1. test_1.avi
  2. test_2.ogg
  3. test_3.srt

……の3つのストリームがばらけて、もとのディレクトリにでてきます。 もっとストリームがあってもほぼ同様です。 ここで、-a は、すべてのストリームを抽出すること、 -p は進行状況(プログレッシブ)表示をすることを指示するスイッチです。 詳しくは、-h参照。

GraphEditを使ったOGMのDemux等

GraphEdit を使えばGUI的に作業することもできます。 GraphEdit は汎用性が高いぶん少しとっつきにくい感じがするかもしれませんが、 OGMからストリームを取り出す程度の作業は、少しも難しくありません……。

GraphEdit を起動したらば、 [Ctrl]+[R] を押すか、またはメニューの File > Render Media File を選ぶと、 ファイルを開くダイアログがでるので、編集したい OGM ファイルをロードします。 下の図は、mew2.ogm というサンプル(このサンプルファイルは、 2002年11月5日現在、http://s32s.tripod.co.jp からダウンロードできます) を開いた例です。 OggDS、SubTitDS、DirectVobSub、XviDコーデックなどは、すでにインストール済みとします。 なにやら複雑そうな図がでてますが、これは GraphEdit が勝手に描画してくれる図なので、 ユーザは別に何もすることありません。

説明の図。マルチメディアのファイルがどのように再生されるのか、グラフィカルに表示されます。

左から順に見たら、まずOGMファイルが Ogg Splitter というスプリッタに読み込まれ、 そこで3つのストリームにスプリットされ、XviDのデコーダや、Vorbisのデコーダ、DirectVobSub などを経て、 最終的な出力ストリームが合成されるありさまが表示されています。 では、OGMを再生するのでなく、分解された成分をファイルに保存するようにしてみます。 なお、以下のような作業を行っても、Windows の内部の DirectShow の矢印のつながり方が恒久的に変更されてしまうわけではなく、 あくまでロードされているこのファイル一回限りの臨時の仮想的な編集ですし、 矢印のつなぎ方を間違えても、GraphEditがクラッシュする以外の害は発生しないので、 ハック精神であれこれ試して大丈夫と思います。

まず、再生するわけでないので、要らないモジュールは消します。 マウスで箱みたいなのをクリックすると選択されて青くなるので、 [Del] を押して消します。

とりあえず、OggSpliter よりうしろは、ぜんぶ消してください。

出発点のOGMファイルと、それをスプリットするモジュールの2個だけが残ったと思います。 この例では、スプリッタには3つの出口があって、0、1、2、と出口の番号がふってあります。 上からビデオ、オーディオ、サブタイトル(字幕)です。 手始めに、ビデオ成分だけをファイルに書き出してみましょう。 ツールバーの [ Insert a filter into the graph ] という青いボタン をクリックして、 Which filters do you want to insert? というツリービューのダイアログがでたら、 DirectShow Filters という項目の左の + 印をクリックして、 DirectShow のフィルターを一覧表示させます。

OGM を AVI ファイルとして書き出してみましょう。 ツリービューのなかから [ AVI Mux ] をダブルクリックして選択します。 これは AVI ファイルを合成するモジュールです。 ダブルクリックしたら、AVI Mux という四角い箱が青く選択された状態で、 メイン画面に挿入されます。(ダブルクリックでなく、選択して [Insert Filter] をクリックでも同じ)。 もうひとつ、File Writer もダブルクリックして選択します。 これは、完成したストリームをファイルに書き出すためのモジュールで、 書き出すファイル名を選ぶダイアログがでるので、test1.avi とでもつけておいてください。 2個のモジュールを追加できたなら、 Which filters do you want to insert? のダイアログはもう要らないので閉じると、 次のような状態になってると思います。

Ogg Spliter の出力の Video 0 という出っぱりと、AVI Mux の入力の Input 01 というのを、 マウスでドラッグしてつなげます。(ビデオをダビングするときとかにリアルで線をつなげる操作を、 イメージしたらいいでしょう。)矢印の出発点になるポッチの上でマウスボタンを下げて、 そのまま矢印をさしこみたいポッチの上までドラッグして、ポッチの上に来たらマウスのボタンを上げるだけです。

すると、矢印がつながって、整理された図が再描画されると思います。難しいことは何もありません。

同様にして、AVI Mux の OUT を最終目標である test1.avi の IN とつなげたら一丁あがり。

なお、AVI Mux の四角には自動的に入力端子が一個ふえて、もう一個何か入力できる状態になってます。 この図を見ていると、「ははぁん。同じように音声もつなげばいいのだな。 つまり Ogg Splitter の Audio OUT を AVI Mux の IN とつなぐだけじゃん。楽勝、楽勝」 と感じるかもしれません。考え方は要するにそれだけのことなのですが、 ただし、よく考えてみると、Ogg Splitter がスプリットしたオーディオ成分は Ogg Vorbis なので、 AVIのミキシング装置(WAVかMP3を待っていると思われ)に直接ぶちこむのは、 たぶん、うまくないでしょう。 リアルなら火花が飛んでボンとかいって機械が壊れるかもしれません。 ……PCM(wavファイル)か何かに変換するフィルターを通してから、線をつなぐことになります。 が、ここでは、とりあえずの練習として、オーディオは無視して、映像だけのAVIファイルを書き出してしまいましょう。 線はすでにぜんぶつないであるので、ツールバーの黄緑色の「再生開始」ボタン を押すだけです。数秒で test1.avi が書き出されると思います。

同様に、OGMからOGGオーディオ成分を抽出するには、 スプリッタの Audio OUT を Ogg Multiplexer につないでから、 test2.ogg などの名前で File Writer に渡します。 無圧縮WAVで書き出したい場合には、 Ogg Multiplexer のかわりに Vorbis Decoder を通して、test2.wav などとします。 Vorbis Decoder の後ろにさらに MPEG Layer-3 のフィルター(ツリービューの Audio Compressers 内)をはさんで mp3 で書き出すこともできます。 これらのフィルタは、すべて Which filters do you want to insert? のダイアログから簡単に選べます。 たくさんのマルチメディア関連機材を仮想的に所有してるような気分がして楽しいかも……。

また、OGMからSRTの字幕成分を取り出すには、 スプリッタの Subtitle OUT を Subtitle Dest フィルターにつなぎ、 その出力(XForm Out)を File Writer に test3.srt などの名前で渡せば良いです。

これらの3ファイルの書き出しは、同時に実行可能です。

オーディオをMP3成分などに変換して、AVI Mux のもうひとつの IN につなげば、中間ファイルを経由しないで、 直接、音声 mp3 のAVIファイルに変換することもできます。このとき、 AVI Mux を右クリックして見れるプロパティの設定画面で、 Interleaving を full にしておくと良いでしょう。 字幕成分は必要なければ、捨ててしまってかまいません。 Direct VobSub とうまくつなげば、字幕をハードエンコードした状態の AVI を書き出せるのでは? とかの考えも浮かぶと思います。いろいろ試してみてください。

mp3 にするには、まず Vorbis Decorder で OGG を WAV にして、 次に mp3 のエンコーダーで WAV を mp3 にします。線のつなぎ方、つなぐ順序に注意。 変換のパラメータをコントロールしにくいので、WAVで書き出してからあらためて mux したほうが良いかもしれません。

最初に書いたように、OGMを単純に demux するだけならコマンドラインツールで一発ですし、 ふつうの編集なら VirtualDubMod でできますが、 GraphEdit を使ってみると内部的にフィルターがどういうふうにつながってるのかよく分かっておもしろいと思います。

結び

以上のように、OGM動画は、AVIやMpegと比べても、決して再編集しにくいということは、ありません。

OGMについて言えば、 従来のAVIより高圧縮、高効率が実現できるのは、単に音声がOGGであるため(wav/mp2/mp3/ac3音声よりすぐれている)だけでなく、 AVIでは正式にサポートされていないソフト・サブテキスト・ストリーム、 複数チャンネル/マルチサブが簡単に実現できることなど、 i18n、m17n の観点からもなかなかおもしろい形式です。

といっても、OGMが唯一将来性がある形式というわけでなく、 Ogg関連の唯一の動画形式というわけですらなく、 もちろん欠点がないわけでもありません。 「拡張性が大きい」ことと部分的には関係するとも言えるのでしょうが、「仕様がゆるすぎる」 (結果として個々のアプリ特有の仕様がいろいろできてくる)という問題があります。 SubTitDS が独自にサポートするタグが現状、DVobSub と互換性がないことは、その現れでしょう。 開発者のあいだに意思の統一がないこと、仕様の限界などもOGMの将来にとって不安要因です。 いずれにせよ、ogg関連は基本的にソースが公開されているオープンな形式なので、 WMVやRMのような「一方通行/行き止まり」感の強い形式 ――  「一度生成(mux)してしまうと、可逆的に元に戻せない(demuxできない)」といった ―― とは、かなり感じが違いますし、 とりあえずMCFがブレイクするまでのあいだは、OGMで遊ぶことができるでしょう。

OGMをサポートする個々のソフトがオープンソースでない場合、 将来、そこに非公開、秘密主義の害が発生してしまう可能性はありますが、 現状、mux も demux も自由自在に可能であり、 ということは、ビデオ成分は XviD や DivX なのだから、 AVIの動画と再編集のしやすさはほぼ同じと考えて良いはずです。 少なくとも現時点に関する限り……。

関連記事

リンク

この記事のURL


[OGM] 0x80-FFを含む字幕の行末が脱落する

2002年11月11日
記事ID d21111

DirectVobSub 2.18 for Windows は、 ウムラウト付き文字のような特殊文字を含む字幕をほぼ問題なく扱えるが、 OGM動画の場合、行末の文字がレンダリングされない場合がある。

現象

OGMコンテナにmuxするSRT字幕ファイルが0x80-FFのコードポイントを含むとき、 Windows のシステムの言語設定が日本語になっていると、 DirectVobSub(DVobSub)2.18 は行末の1バイトないし数バイトのレンダリングに失敗することがある。 この現象は、SRTファイルがmuxされている場合にのみ発生し、 DVobSubでも、再生時に外部から読み込む場合には発生しない。 また、0x80-FFの文字それ自体のレンダリングに失敗するわけでもない。 しかし、この現象は、字幕が0x80-FFを含まないときには発生しない。

例示

次の行(SRTファイルのデータ)はウムラウト付きのa (0xE4) を含む:

Olemme nyt fantasiamaailmassa, missa haltiat elävät

この行を含むSRTをOGMにmuxした結果、該当部分には次のように、行末の t の文字までのデータが正常に含まれている (OGMファイルのデータをバイナリエディタで開いてAsciiで解釈した場合)。

(略)...elävät[0D][00]OggS(次のデータ)...

しかし、手元の Windows 2000 上で、DVobSub 2.18 は、改行文字の直前の t のレンダリングに失敗する。

この行に含まれている ä の文字を仮にぜんぶ、ウムラウトのつかない a に置き換えれば、この問題は発生しない。また、システムの言語設定が Western Europe and United States であれば、 この問題は発生しない。

環境の詳細

Windows 2000 SP3 日本語版、 言語: 日本語(地域設定 English)、 IE6.0 SP1、DirectX 8.1、 OggMux 0.9.4、 OggDS 0.9.9.5、 SubtitDS 1.4.0.0、 VobSub 2.18、 Media Player Classic 6.4.00.0005、 ffdshow なし

原因

未詳だが、恐らく DVobSub の問題。 GraphEdit を使って、Ogg Splitter から直接 Subtitle Dest に流し込んでファイルに書き出すと、 文字の脱落は起きていない。 れいによって、 0x80-FF がシステム言語(日本語)とラテン1補助の両方によって使われることと関係あるのでは……。

対応

SRTデータの行末に1個ないし数個の空白文字(0x20)をダミーで追加することによって暫定的に回避できる。

実際には、DVobSub は問題を回避できていないが、 脱落するのが無視しうるダミーの空白なので。 再生側で DVobSub を使わず、SubTitDS の Subtitle Muxer を使うことは、現状、現実的でない。

処理を自動化するためのスクリプト

行末の空白は32個(日本語のSRT字幕では各行末に64個)を推奨。 特にOGMで日本語のSRT字幕を使う場合、いくつか注意する点がある。下記の別記事をごらんください。

付記

もし日本語字幕専用のビルドを使えば、ラテン1補助は完全に文字化けするだろう。 現状ではラテン1補助をほぼ表示できるかわりに、日本語の字幕が中途半端に文字化けするようだ。 どっちにしても中途半端だ。(OSの言語設定が「西欧/アメリカ」になっていると、どちらも文字化けしない。 DVobSub などがこれらの言語圏で開発テストされていることと関係あるのだろうが、 OSが日本語に設定されているとかえって日本語字幕に不具合が出て、 OSが「西欧/アメリカ」だと日本語字幕が正しく表示されるようだ。) 同じ0x80-FFをいろんな意味に使い回してきたツケは大きい。 とりあえず、フォント/言語で何々語、何々語といちいち切り替えるのがうっとうしいので、 「font=unicode, 言語=不特定・汎用」が選択できるようになってほしい……。 (VDubに対する TextSubフィルターなら、UTF-16のファイルをいちおう正しく解釈できる。)

一般的にいえば、日本語環境での Ascii 0x80-FF がらみは、ありがちな不具合パターンだが、 新しい形式であるOGMにこのような不具合がでるのは、 結局、仕様が厳密に決まっていないOGMコンテナの弱点のように思う。 もっとも、このSubtitDSは開発ベータ版であり、 しかもつい最近、内部的にユニコードに切り替わったばかりなので、 多言語対応がまだ安定しないのも仕方ないとも言えるが……。

更新履歴

2002年11月13日: システムの言語設定が欧米であると不具合が出ないことを付け加えた。また、DVobSubは、 ISO-8859-1 の文字セットをサポートしているわけでも、 この文字セットに関して不具合が出るわけでもないので、 「ISO-8859-1」と記述していた部分を「0x80-FFのコードポイント」のように改めた。 実用的には、IS0-8859-1(ラテン1)の補助文字の部分と理解してもほぼ正しいが、 実際には、DVobSubの「欧米」フォントは、Windows-1252に従う。 別の角度からいえば、ラテン1とは違うチェコ語のような言語の字幕でも、 同じ問題が発生する。

2003年3月4日: 処理を自動化するためのスクリプトを作成、別記事で紹介した。

2003年3月12日: [OGM] SRT日本語字幕 SJIS/UTF-8 (2003-03-08) へのリンクを追加した。

この記事のURL



メールアドレス(画像): [ http://www.faireal.net/image/2005/addr.png ]