mencoderで字幕の焼き込み
動画ファイルの変換にはffmpegという強力なツールがあって、普段、ぼくもffmpegを使ってる。たいていの変換はこれでできちゃうのですごく便利なんだが、サブタイトルを焼き込むんだったらmencoderが便利だ。
先日「これに日本語字幕を焼き込んで」と言われて渡されたファイルにmencoderで字幕を焼き込もうとして、例のlibfaacの問題に気がついたというわけ。結局、mplayerのソースを取ってきてコンパイルしなおして、mencoderのパッケージを上書きした。
で、日本語のsrtをmencoderでちょいちょい(でもない)と指定してできあがり。
ちなみにこのファイルは、サムスンの工場でぞろぞろ人が死んでる、それなのにサムスンは労災隠しに汲々として、労働組合も認めないという、サムスン告発のビデオ。サムスンの液晶や半導体製品は、安くて高品質で好きだったんだけど、このビデオを見たら、いやー、サムスン製品はもう買えないね、と。
どういう感じかというと、ばかでかくてアスペクトが何かおかしいwmvの元ファイルを640x480のaviにして、srtのサブタイトルを画面の上に焼き込む。具体的には、次のような感じ
mencoder sharpsfull01-1.wmv \ # 元ファイル
-vf scale=640:480 \ #ビデオフィルタでスケール調整
-sws 7 \ # スケールはガウス変換
-oac mp3lame -lameopts cbr:preset=192 \ # 音声はmp3 192k
-ovc lavc -lavcopts vbitrate=1000 \ # 映像はlavcのデフォルト(mpeg4)帯域は1000k
-sub sharpsfull01-1.srt \ # サブタイトルのsrt
-utf8 \ # 文字のエンコードはutf8
-slang ja \ # サブタイトルの言語は日本語
-subalign 0 \ # サブタイトルは上に表示
-subpos 0 \ # サブタイトルの相対位置
-subfont-outline 6 \ # 文字の輪郭の太さ
-font 'HGPSoeiKakugothicUB' \ # 字幕用フォント
-sub-bg-alpha 255 \ # 字幕背景は不透明
-o sharpsfull-640.avi # 出力ファイル
これはストレートな焼き込みだけど、ワイドの画面だったりすると、下に黒いスペースを作ってそこに字幕を表示させたりするなんてこともできる。
iPod用のビデオファイルを作るのに、ぼくはこれまで、ffmpegとmencoder/mplayerを使って結構ややこしいスクリプトを書いて使っていたのだけど、これをmencoderで書き直そうと思って現在作業中。コマンドそのものは、上とほとんど同じだけど、
-vf scale=320:180,expand=0:-60:0:0:1,harddup
みたいなフィルタを入れて黒帯を出すところと -of lavf -lavfopts format=ipod で出力させているところが違ってるぐらい。ただ、iPod用のH.264でエンコード(Baseline@Level 1.3)するところがちょっと苦労したところで、デフォルトの-x264encoptsに weightp=0 というパラメータを設定しなきゃいけなかった。これがないとプロファイルがMainになってしまう。最近のiPodとかiPhoneとかはMainでも再生できるのかな。
なお、libavfのマルチプレクサは壊れてるらしいのだが(実際、mencoderが警告を出す)とりあえず問題なくiPodは認識する。
汎用のスクリプトにするには、あとはサイズに関するパラメータを設定したりというような処理を追加すればいい。
動画ファイルからサイズなどの情報を取り出すには、コンテナごとに専用のツール(mp4info, tcprobeなど)が用意されているが、いろんなファイルごとに異なるコマンドを実行するのはめんどくさい。この場合はmplayerの identify オプションが強烈に便利だということに最近気がついた。シェルスクリプトの中から
typeset $(mplayer -vo null -ao null -frames 0 -identify ファイル名 2>/dev/null | grep ^ID_)
とやると、ID_で始まる変数がセットされるので、これで縦横を取得して320x240に縮小して適当な黒帯の高さを計算させることができる。あとはsrtでもsubでも適当に字幕を判別させたりとか、まあ、そのへんは時間のあるときにゆっくりやればいい。古いffmpegベースのスクリプトもあるので、急いで作らなくても困らないし。
新しいコメントの投稿