6 : 15 OGM動画

← 6 - 14 p↑ もくじ i 6 - 16 n →

OGM動画(XviD + OGG + SRT)の作成と再生

2002年10月25日
記事ID d21025

OGM動画のひとつの利点は、字幕をオンオフできることです。 ひとつのファイルで字幕なし版と字幕つき版をかねることができ、 仕様としては、複数言語の字幕を切り替えることも可能です。 字幕を画像のなかにエンコードしてしまうと、どうしても画質全体に悪影響がありますし、 字幕なしですっきりオリジナルを見たいというとき、さまたげになります。

また音声がOGGのため、高圧縮が期待できます。 lame abr 128Kbps と「ほぼ」同等のものが、それより10%程度小さいサイズで実現できます。

XviD画像、OGG音声、SRT字幕の3つのストリームを含むOGM動画の作成と、 それがどんな感じに再生されるのかみてみます。

Xvid + OGG + SRT の作成

作成に興味ないかたは、このセクションは飛ばしてください。 XviD Codec、OggDS、Vorbis Tool、SubTitDS、DirectVobSub、OggMux、 および最新の DirectX 安定版などはインストール済みとします。 (すべてフリーウェア)

例として「東京ミュウミュウ」のOPを使ってみます。 まず映像を用意します。 ソースがテレビからの録画で、画面左上にテレビ画面の時計が映りこんでいるので、 LogoAwayフィルターで時計の除去を行っていますが、そのほかは、ごく一般的な XviD エンコーディングです。

次にOGGファイルの音声を用意します。OggDropを使うのが簡単ですが、それだといろいろ制限があるので、 oggenc を使うほうがやりやすいと思います。

最後にSRTファイルですが、いろんなやり方があるとは思いますが、ここではSSA経由で作ってみます。

まず1回に表示される字幕が1行になるように、テキストファイルを用意します。

I tied a ribbon in my hair
...and then I tried to smile
I felt as though
...I had changed who I was
A little bit of courage
...

フリーの字幕編集統合環境 Sub Station Alpha でこれを読み込んで、 何秒から何秒にどの字幕が入るのかタイムスタンプをつけます。 字幕をつける部分とぴったり同じタイミングで始まる WAV ファイルを用意して、 Sub Station Alpha で読み込んで、再生しながら、 音声の波形グラフの表示の歌の一行の開始点で左クリック、終了点で右クリックするだけです。 ことばで説明するとややこしいですが、1分程度の歌(10行くらい)なら5分もあればできるでしょう。 (詳細は別記事「SSA入門 タイミング編」)

SSAの仕様で、読み込める WAV は 8bitモノラルの Windows PCM です (あくまでタイミング測定用で、この音質は仕上がりの音質とは無関係)。 いろいろなバグのせいで、ファイルを分割したり終了点を必要以上に長めにしないと読み込めないことがあります。 また Windows のロケールが日本では動作しません。 File is not a valid wav というエラーが出たら、 ロケールが英語(US)になっていることを確認してください。 さらにまた、VBR MP3 から WAV を作るとき黙って平均値の CBR に書き換えてしまうソフトを使うと、 タイミングを測った結果が映像のタイミングとずれてしまうので注意。

SSAができたら、 最初に用意した XviD のファイルと同じディレクトリに拡張子だけ .ssa に変えたファイル名で保存、 XviD を再生して、字幕のタイミングとかがちゃんとできてるか確認します。 きちんとインストールされていれば、 DirectVobSub が自動起動してSSAに指定された字幕のたぐいを再生時リアルタイムで、 動画の画面上にスーパーインポーズしてくれるはずです。 これを確認して必要ならSSAを修正します。

640x480の動画の場合、エディタでSSAファイルを開いて、PlayResY: の右の数字を480に書き換えます。

SSAがオーケーなら、適当な変換ツールでSRTに変換します。

1
00:00:13,980 --> 00:00:17,290
I tied a ribbon in my hair

2
00:00:17,510 --> 00:00:20,060
...and then I tried to smile

3
00:00:20,170 --> 00:00:23,240
I felt as though

SSAは必ずしも上から下へ時系列に従って書かなくてもタイムスタンプの順序でちゃんと解釈されますが、 SRTが時系列に従っていないと、時間が前後している部分が解釈されないうえ、シークバーが使えないなどの害が出ます。 ですので、SRTに変換する予定があるSSAは時系列に従って作成するか、 またはSSAのタイムスタンプ順序を正しく解釈してSRTに変換できるツールを使う必要があります。

こうして、XviD、OGG、SRTができたら、OggMux で Mux して、OGMファイルのできあがり。

再生

OggDSとSubTitDSのおかげで、いろいろなプレーヤーでOGM動画を再生できるようになりました。 字幕の表示形式(色、フォントの種類、フォントサイズ、位置など)は再生時に好きに変更できます。 必要なければワンクリックで字幕をオフにすることもできます。 この字幕は画像として焼き込まれているものでありませんから、 ファイルサイズがムダに大きくなったり、 細かい字幕のせいでビット不足におちいりブロックノイズが出たりといった害がありません。 以下の例は、サンプルとして 1pass のデフォルトのまま(品質85)で作ったもので、 とくに高画質では、ないです。

Media Player Classic もOGM動画をきれいに再生できます。 Media Player 6.4.x では字幕のオンオフとは別に「キャプション」 として字幕部分を下の黒い余白にプレーンテキストとして表示できます。 これは、なかなかクールな機能です。 将来、もっと充実した「キャプション」機能をサポートするプレーヤーが出れば、 字幕をビデオ画面内に表示しなくてすむでしょう(言い換えれば、オリジナルの画像をそこなうことなく、 字幕を下に表示できるようになるでしょう。) Media Player 6.4 では画面内の字幕のオンオフとは別にキャプションをオンオフできます。

関連記事

この記事のURL

テキスト版省パケ版XML版


同じAVI+MP3(VBR)でMuxのたびに結果が異なる

2002年10月 9日
記事ID d21009

Windows で動画を作るとき、lameなどの外部エンコーダで生成した VBR MP3 を動画の音声として使いたいというのは、よくある要求でしょう。例えば、IIS MP3 192Kbps CBR のようなソフトウェアからすぐ使える音声圧縮を使うより、
lame -m j -q 0 -V 0
などとしたほうが、おそらく、より高音質なサウンドでオーディオ部分のファイルサイズは減少し、同じ仕上がりサイズで考えるとそのぶん映像部分により多くのビットをまわすことができて映像の品質も向上します。また、より高圧縮にしてオーディオ部分のサイズを節約したい場合でも、外部エンコーダでVBRを使うのが効果的かもしれません。これらの点については、すでに多くの情報があるかと思われます。

以下では、NandubVirtual Dub MP3(vdub_mp3_freeze.zip)などを使ってAVIビデオとMP3ファイルを合成(Mux = Multiplex)した場合、同一設定で同じ映像ストリームと同じ音声ストリームをそれぞれ Direct Stream Copy しているにもかかわらず、まったく同じ操作を2度、繰り返したとき、生成されるファイルが厳密には一致しない現象について説明します。

現象

Lameなどで外部的に用意したMP3ファイルと、あるAVI(DivX, XviD, MS-Mpeg4, etc.)の映像を mux する同じ操作を繰り返した場合、完全に同じ設定で同じ mux をしているにもかかわらず、生成されるAVI動画は、一般に、そのたびごとに異なったものになります。具体的にいうと、生成されたファイルのサイズは何度やっても完全に一致し、映像、音声とも内容は厳密に一致するにもかかわらず、MD5やCRCは、一般に、Muxのたびごとに異なってます。

原因

2つの原因があります。

  1. 映像、音声のいずれにも影響しないファイルのヘッダ部分の一部で、プログラムが、実用的にはまったく問題ないものの、完璧主義者の美学に反する挙動をしてます。具体的には(厳密な説明でないが、こういうこと)例えば構造体のあるフィールドを1024バイトまずメモリ上に確保したとして、それを確保したままヌルパディングせず、最初の1022バイトを仕様通りに終端し、未使用の末尾2バイトは関係ないので放っておく、というような動作です。結果として、末尾2バイトは、メモリを確保したときたまたまメモリ上にあったゴミ値がそのまま残るので、一般に、そのたびごとに異なる値になります。これはDNAの使われてない部分のようなもので、ここがいかなる値になっていようと、映像、音声の表現型には、まったく影響しません。一般的な Vdub-mp3 では、この種の「なりゆきまかせのゴミ値」が2バイト×2か所あるようです。
  2. これに加えて、Nandubは、ヘッダのコメントフィールドに独自のコメントをうめこみます。そのため、Nandub で mux したものは、ほかのソフトで mux したものと異なるファイルになります。

注意: ここで「ファイルが異なる」というのはバイナリレベルで1バイトずつ比較した厳密なファイル内容が等しくない、という意味であり(言い換えれば、ファイルのMD5値やCRCが一致しない)、そのファイルを再生したときの「表現型」(映像、音声)は全部のフレームが完全に同じです。いわゆる「エンコードの結果が異なる」(例: ノイズの出方が違う)のでは、ありません。

以下は Nandub がヘッダに埋め込むコメントのダンプ例です。(ダンプリストを読まずに次へ進む。)

 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF 
------------------------------------------------------------------------------
 000022D0  00 00 00 00 00 00 4C 49 53 54 1C 00 00 00 49 4E   ......LIST....IN 
 000022E0  46 4F 49 53 46 54 0F 00 00 00 4E 61 6E 64 75 62   FOISFT....Nandub 
 000022F0  20 76 31 2E 30 72 63 32 00 00 4A 55 4E 4B FE 04    v1.0rc2..JUNK.. 
 00002300  00 00 4E 61 6E 64 75 62 20 62 75 69 6C 64 20 31   ..Nandub build 1 
 00002310  38 35 32 2F 72 65 6C 65 61 73 65 00 00 00 00 00   852/release..... 

次の画像は、vdub-mp3 で同じ設定で書き出した2つのファイルの相違部分をバイナリエディタで検査した例です。

長大なヘッダのなかの末尾のどうでもよさそうな2バイトが異なるだけ、という画像

対応

この問題は映像、音声、ファイルサイズのいずれにも実質的な影響を及ぼさないので無視することができますが、生成されるファイルのCRCが(実質的には無意味な部分の違いにより)一致しないという事実に注意します。例えば、友人に映像用のAVIと音声のMP3をべつべつに送って、むこうで mux してもらう場合、あなたが手元で mux したものと向こうで作ったものとで md5 などを照合しても一般には必ず一致しません。ですので、単に上のようなどうでもいい理由でCRCが合わないのか、それとも何かの実質的なトラブルが起きているのか、md5 や CRC では切り分けができないことになります。このようにmd5やcrcがあてにならない状況下において、ネットワーク越しにファイルの整合性を照合する必要がある場合、必要なら、zidrav などを使うことができます。区間ごとにチェックサムをとると、もし mux 自体は正常なら CDP パッチは非常に小さなファイルになるはずです。このCDPパッチによって、友人のファイルと手元のファイルを、無意味バイトまで含めて完全に一致させることもできます。

参考

VBR の MP3 を mux した場合、完成したAVIファイルを一般のツールでひらいて再編集すると、音ズレの原因になります。VBR の MP3 をサポートしないツールでは、これをVBRの平均値のCBRであるかのように扱うからです。とくに、ノーマル版の Virtual Dub では「VBR audio stream detected」という警告がでて、次の例のように言われます。

VirtualDub has detected an improper VBR audio encoding in the source AVI file and will rewrite the audio header with standard CBR values during processing for better compatibility. This may introduce up to 8951 ms of skew from the video stream. If this is unacceptable, decompress the *entire* audio stream to an uncompressed WAV file and recompress with a constant bitrate encoder. (bitrate: 157.8 ± 30.8 kbps)

この例では、最大8951ミリ秒の音ズレが生じる可能性があると予告しています。(なお、Vdub のダイアログボックスのなかの ± [0xB1] の字は日本語環境のOSでは半角カタカナの「ア」に文字化けするかもしれません。)

つまり、一般のツールでは、MP3 VBRの場合、「音声はそのままで画像だけ再圧縮」のような、簡単にできそうなことができません(できるけれど、音ズレが生じる)。例えば640x480の350MBのファイルがあるとして、そんなに必要なファイルでないけれど、いちおう資料用に、320x240の80MBくらいに再圧縮してCD-Rかなにかに残しておく、というようなことをやる場合、もとファイルの音声がVBRだと音ズレが起きる可能性が高いです。

このような場合、Virtual Dub は「いっかい wav に戻してからCBRで再圧縮」をすすめてきます。が、それでは時間も手間もかかるし音質はそのままでいい場合でもファイルサイズが同じで音質が悪化してしまいます。ので、こういうときは、VBR MP3 をサポートしている vdub-mp3 か nundub などを使うのが良いでしょう。注意点として、Virtual Dub で「Direct Stream Copy」を選んだ場合であっても、実際には Direct にコピーされずヘッダが書き換えられてしまいます。AviUtlの場合は、特に警告ないまま CBR化されるようです。

このメモの内容は手元で独自に調べたものであり、無保証です。何らかの意味で間違っているかもしれません。

この記事のURL

テキスト版省パケ版XML版


作ってみた ogm (音声が .ogg な動画)

2002年10月 2日
記事ID d21002

OGMの再生法は別ページをごらんください。 日本語での字幕については、別記事SRT日本語字幕 SJIS/UTF-8を参照。

拡張子が .avi の動画では、オーディオ部分は mp3 になってることが多いと思います(ビデオ部分は、DivX や XviD などで圧縮されている)。最近、gif に対する png のように、mp3 に対するパテントフリーの音声圧縮フォーマット Ogg Vorbis (拡張子.ogg) が少しずつ広まってきてます。動画の音声部分に Ogg Vorbis を用いる Ogg Media (OGM)形式も、字幕や複数音声のサポートなど、あんがい将来性がありそうです。やってみたらとっても簡単にできることが分かったので、興味あるかたは試してみてください。以下、Windows 2000 でのお話です。

音声部分を用意

サンプルに使ったのは、SkyperfecTV からキャプチャーしたアニメのED部分です。インターレース解除、フレームレート変更、ノイズ除去などのフィルター処理には使い慣れた AviUtl を使ってますが、もちろんほかのソフトでもかまいません。

とりあえず、WAV出力でオーディオだけ書き出してみます。これを ogg に変換しときます。wav から ogg への変換は、Oggdrop を起動して、さかなの絵のうえに変換元の wav ファイルをドラッグ&ドロップするだけ……。

デフォルト(96Kbps相当)以外の音質に設定したい場合、さかなのうえで右クリックして適当にパラメータを設定します。サイズを小さくしたい場合、ステレオ64Kbps相当の Quality = 0(最高圧縮)でも良いでしょう。MP3に比べて、ここでかなりサイズをかせげます。

変換中、さかなの絵がくるくる動いて、あっというまに変換元の wav があったのと同じフォルダに ogg ファイルができあがります。

ビデオ部分を用意

今度は映像部分のエンコードを行います。ここではフリーな形式ということにこだわって、画質も優秀な XviD で圧縮してみました。べつに DivX3 や DivX5でも良いのですが……。エンコは、ごく一般的な AviUtl のエンコードで、とくに付け加えることはありません。動画をあつかうかたなら、いつもやってる通りの作業です。

オーディオ部分は後から合成するので「音声無し」でAVI出力しときます。

音声とビデオ部分を合体

OggMuxを使えば、あっけないほど簡単にオーディオとビデオを合成(Multiplex)できます。Ogg用のDirectShowフィルターをインストールしてないかたは、まずそれをインストールしてください。そうすれば、Media Player ほかでも音声が ogg の動画をふつうに再生できるようになります。2002年10月2日現在の最新版は 0.9.9.4 で、Ogg Vorbis 1.0 をサポートし、最新の Windows Media Player 9 Beta にも対応してます。インストールもダウンロードしてきた OggDS0994.exe のようなファイルをクリックするだけ。OggDS.dll がシステムフォルダにコピーされ、自動的にレジストリに登録されます。

OggDSフィルターがすでに入っている場合は、OggMux.exe を起動してビデオファイルとオーディオファイルを選択して [Mux File!] をクリックするだけ。

この記事の時点で OggMux の最新版は 0.9.2

なお、Soundtracks の欄は [...] をクリックしてOGGファイルを参照してプルダウンリストから言語を選んでから、[Add] を押せばリストに入ります。オーディオストリームが一本だけなら、言語を指定してもあとから切り替えられるわけではないですが、ファイル内容の情報として入れておけばいいでしょう。

処理は数秒です。できあがりの出力ファイルの拡張子は、何も指定しないとデフォの .ogm (Ogg Media / Ogg Movie) になります。が、拡張子ごとの関連づけやアイコンの設定が面倒なら、.avi ないし、.ogm.avi にでもしとけば簡単でしょう。DirectShowフィルターを入れたのだから、.avi の拡張子に関連づけられているプレーヤー(それが何であれ)で再生できるはず。

以上で ogm ファイルが完成~。

ホントに簡単。DivX や XviD でエンコしなれてるかたにとって、ogm への敷居は、きわめて低い(その日からすぐ始められる)と思われます。内容は XviD なりの画質と ogg の音質があわさっただけですが、この ogm という形式には、OggMux のGUI画面から見てとれるように、同一のビデオストリームに対して、複数言語のオーディオストリームや、字幕ストリームなどをミックスできる、といった将来性があります。はやくいえば、DVDみたいなものです。当然、複数言語の音声を切り替えたり、あと(たぶん)プレーヤーが対応すれば字幕をオンオフできる仕様なのだと……。しかも、DVDはオーディオ、ビデオとも mpeg2(現在の感覚にてらすと低画質、低効率の圧縮とも思える)ですが、OGM では、より圧縮効率の良い mpeg4 系が使えるわけです。

もちろん XviD + OGG Vorbis が次世代の可能性のすべでじゃないですが、気軽にできるので、ひまなときにでも試してみたらいかがでしょう。

参考リンク

関連記事

この記事のURL

テキスト版省パケ版XML版



webmaster@faireal.net