PC-Blues # 047 flvとmpegとDVD

you tubeに採用されたためか、近頃動画ファイルではflvというのがハヤリである。比較的小さなサイズで、比較的キレイな動画が楽しめるというわけである。とはいうものの、これをパソコンではなく、DVDプレーヤーなどで楽しもうとすると、一旦mpegあたりに変換してからでないとうまくDVDになってくれない。

おまけに当家で使用しているDVD作成ソフトウェアはソースネクストが販売しているPowerProducerというヤツで、これは本家のCyberLink製品の型落ち品なのだが、何せ1980円というわけなので、本屋でちょろっと買ってしまった。こうなるとさすがに新しいフォーマットには対応していないので、どうしてもconverterで変換してやる必要がある。

さて、この手の変換ソフトあるいはコンバータをGoogleで検索したところ、 「携帯動画変換君」 「flv2psp」freez flv2avi」「flvconverter」といったフリーソフトがあり便利そうである。

ところが、順次ダウンロードしてみるとどれもこれも、見覚えのあるdos窓が開く。なんだffmpegではないか。Linuxでおなじみ、テレビ見るのも予約録画もこれ一つという便利ものである。ただオプションが多過ぎるため、久しぶりに使うとすっかり忘れているという難点のあるアレである。

さきほどのソフトウェアはどれもこれにかぶせたバケの皮というわけであった。ではあるが、なかなか便利である。インプットファイルを選び、アウトプットファイル名を指定すればそれでDVDなり、携帯動画なりに最適なオプションを与えて実行してくれるし、ffmpegはソースで配布されているので、コンパイルしなければならない。Linuxなら、コンパイラが標準付属のでどうということはないが、それでもコンパイルオプションの指定も結構メンドウである。まして、ウインドウズならばコンパイルできる環境を整えなければならない。それが、コンパイル済みのバイナリと適当なオプションがあっさり手にはいるというのである。

しかし、これにも困ったことがあって、複数のファイルを全部一辺に変換したいという場合にいちいちひとつひとつ指定するのは結構苦痛である。わたしのマシンでは一つの変換に10分くらいかかるので、10個ほどの変換にも10分ごとに指定しなければならないのである。これは厳しい。

flv2pspではこういう場合に備えてコマンドラインでの使用をサポートしている。つまり、コマンド窓をあけて、

  >flv2dvd inputfile.flv outputfile.mpg  
とやるとよいのである。ここで、「inputfile.flv」は入力ファイル名である。適当に書き換えればよい。「outputfile.mpg」も同様である。複数ある場合はバッチファイルを作成して、
  flv2dvd inputfile1.flv outputfile1.mpg
  flv2dvd inputfile2.flv outputfile2.mpg
  flv2dvd inputfile3.flv outputfile3.mpg
  flv2dvd inputfile4.flv outputfile4.mpg  
と書いておけばよいのだが、一つ変換するごとにダイアログボックスが登場し、「complate」(ママ)といいながら、OKボタンへのクリックを要求するのである。要求するだけならいいのだが、クリックしてやらねば、そこで処理が中断してしまうのである。これではフリダシに戻るである。flv2pspにはソースが付属しているから、ここの部分を削って再コンパイルしてもいいのだが、もともとコマンドラインのffmpegに引数を与えるだけのプログラムを再度コマンドラインプログラムとして書き直すというのもちょっとアレである。

それならいっそ、直接ffmpegを呼び出してやればよい。折角flv2dvdが最適なオプションを使用しているのだからそれをチョっと覗いてやれば、調べるテマも省略できそうではある。flv2dvdはここらへん気マジメなプログラムでソースが同梱されている。

C:\Program Files\wanchan\flv2psp\flv2dvd_src.zip

がそうである。このzipを開いてやるとflv2dvd.cというcのソースがあり、その末尾に

  	spawnl(  _P_WAIT,"ffmpeg","ffmpeg"
		,"-i",csrc
		,"-target","ntsc-dvd","-r","29.97","-s","720x480","-b","6000"
		,cdst,NULL
		);  

とある。ようするに -i 入力ファイル -target ntsc-dvd -r 29.97 -s 720x480 -b 6000 出力ファイルとやればよさそうである。とりあえず実験にひとつだけ試してみる。

  >ffmpeg -target ntsc-dvd -r 29.97 -s 720x480 -b 6000 -i Hallelujah_I_love_her_so.flv Hallelujah_I_love_her_so.mpeg  

どうだ。……ところが、

   :
   :
   :
Input #0, flv, from 'Hallelujah_I_love_her_so.flv':
  Duration: 00:03:44.5, bitrate: N/A
  Stream #0.0: Audio: mp3, 22050 Hz, mono
  Stream #0.1, 29.97 fps(r): Video: flv, yuv420p, 320x240
Output #0, mpeg, to 'Hallelujah_I_love_her_so.mpeg':
  Stream #0.0, 29.97 fps(c): Video: mpeg2video, yuv420p, 320x240, q=2-31, 6000 k
b/s
  Stream #0.1: Audio: ac3, 22050 Hz, mono, 448 kb/s
Stream mapping:
  Stream #0.1 -> #0.0
  Stream #0.0 -> #0.1
Error while opening codec for output stream #0.1 - maybe incorrect parameters such as bit_rate, rate, width or height    

エラーである。ナンでだ。どうも、面倒がってオプションを先に書いたのがまずかったようである。しょうがないので、入出力ファイルを先に書くことにする。

  >ffmpeg -i Hallelujah_I_love_her_so.flv Hallelujah_I_love_her_so.mpeg -target ntsc-dvd -r 29.97 -s 720x480 -b 6000  

それいけ。でますね〜メッセージが。

Seems that stream 1 comes from film source: 1000.00 (1000/1) -> 29.97 (30000/100
1)
Input #0, flv, from 'Hallelujah_I_love_her_so.flv':
  Duration: 00:03:44.5, bitrate: N/A
  Stream #0.0: Audio: mp3, 22050 Hz, mono
  Stream #0.1, 29.97 fps(r): Video: flv, yuv420p, 320x240
Output #0, mpeg, to 'Hallelujah_I_love_her_so.mpeg':
  Stream #0.0, 29.97 fps(c): Video: mpeg1video, yuv420p, 320x240, q=2-31, 200 kb/s
  Stream #0.1: Audio: mp2, 22050 Hz, mono, 64 kb/s
Stream mapping:
  Stream #0.1 -> #0.0
  Stream #0.0 -> #0.1
frame= 6730 q=11.2 Lsize=    7514kB time=224.2 bitrate= 274.6kbits/s
video:4800kB audio:1751kB global headers:0kB muxing overhead 14.690762%  

よし、できた。何だかとても速い。1分くらいでできちゃった。ファイルサイズも何だか小さい。とりあえず、メディアプレーヤーで再生してみると問題はない。なんだラッキー♪。ではこれでバッチファイルを書いて……と。

ffmpeg -i Land_of_lala-_Japan_Concert_1985.flv Land_of_lala_Japan_Concert_1985.mpeg  -target ntsc-dvd -r 29.97 -s 720x480 -b 6000
ffmpeg -i That_Girl_Live_1982.flv That_Girl_Live_1982.mpeg -target ntsc-dvd -r 29.97 -s 720x480 -b 6000
ffmpeg -i You_are_the_sunshine_of_my_life.flv You_are_the_sunshine_of_my_life.mpeg  -target ntsc-dvd -r 29.97 -s 720x480 -b 6000
ffmpeg -i i_ve_got_a_woman.flv i_ve_got_a_woman.mpeg -target ntsc-dvd -r 29.97 -s 720x480 -b 6000
ffmpeg -i living_for_the_city.flv living_for_the_city.mpeg -target ntsc-dvd -r 29.97 -s 720x480 -b 6000  

実行。たちまちできる5ファイルである。これはハヤい。メディアプレーヤーで完成ファイルを再生してみると軽快である。いいじゃないか。というわけで、DVDを作成してみると音がでない。どうしたわけだ。ファイルサイズを見てやると妙に小さい。これはDVD規格のMPEG2ではない。結論。出力ファイル名をオプションより前に書くとオプションが無視されるらしい。

というわけで、

ffmpeg -i Hallelujah_I_love_her_so.flv -target ntsc-dvd -r 29.97 -s 720x480 -b 6000  Hallelujah_I_love_her_so.mpeg
  :
  :
  :
ffmpeg -i living_for_the_city.flv -target ntsc-dvd -r 29.97 -s 720x480 -b 6000 living_for_the_city.mpeg  

などとやるとよいようである。

といっても一々この調子でバッチファイルを手書きするのもメンドウではある。自動化、また自動化、これでこそのパソコンライフというものであろう。フォルダにあるflvというflvをすべてdvd規格のmpegにコンバートするのでなければ面白くない。作業そのものは単純である。フォルダ内のflvをlistし、拡張子を取り除いて、 順次

ffmpeg -i XX.flv -target ntsc-dvd -r 29.97 -s 720x480 -b 6000 XX.mpeg    

と書いたバッチファイルをつくって実行するだけである。こういう作業はsedかperlに限る。となると適当なスクリプトをまたぞろ書くことにする。こんな具合に。

  #!/usr/bin/perl
$input="flv";      # 入力するファイルの拡張子
$output="mpeg"; #新しいファイルの名前の後半部と拡張子。
$outputdir="MPEG";    #新しいファイルを入れるディレクトリ。
$output2dir="FLV";    #作業済みのflvファイルを入れるディレクトリ。
$option="-target ntsc-dvd -r 29.97 -s 720x480 -b 6000";#オプションの指定。ちゃんと指定すれば携帯電話用にもなるのだが、だって携帯もってないんだよね。
$ffmpegpath="";       #ffmpegのパス。末尾にはちゃんと/をいれること。なお、フォルダのくぎりは\ではなく/である。
$ffmpeg="$ffmpegpath"."ffmpeg"; #ここはffmpeg以外はちょっと考えにくい。
###########################################################
#
opendir DIR ,".";                     # ディレクトリィを開く。
$flag = mkdir $outputdir ;# 新しいファイルのためのディレクトリをつくる。
print "フォルダを新規作成しちゃったぞ\n" if($flag);
$flag = mkdir $output2dir ;# 作業済みファイルのためのディレクトリをつくる。
print "フォルダを新規作成しちゃったぞ\n" if($flag);
@dir = readdir DIR ;                  # ディレクトリィを読む。
@list = grep {/^.+\.$input$/} @dir;   # xxxx.flvというファイルだけ選ぶ。
foreach(@list){                      # 拡張子をはずす。
    s|^(.*)\.$input|$1|;
    @file = (@file ,$_);
}
foreach(@file){
    system "$ffmpeg -i \"$_.$input\" $option  \"$outputdir\\$_.$output\"";
    system "move \"$_.$input\" $output2dir";
}
print "できあがり\n";
#↑終了メッセージ。 

あとは、このスクリプトとffmpeg.exeをflvをためこんだフォルダに入れて、エクスプローラか、『ファイル名を指定して実行』から実行してやればよい。MPEGというフォルダが新規に作成され、その中にmpegファイルが出来ている仕掛けである。

条件は

である。

素人工作でも便利かなと思うと配布したいのが人情ではある。ffmpegはGPLだから、ソースコードを添付しておけば配布自由なハズである。ここらへんに置いておくので欲しい人は適当に使って頂戴。

[前へ] [次へ]
[Home] [目次]

2007/04/04