[ WSH ] ffmpegを利用してmovをつくる。

立て続けにWSHネタです。

hajimeさんがブログでffmpegに関して書かれていたのを見て、
非常に便利そうだったので僕もffmpegでシーケンスをmovにするスクリプトを書いてみました。

こいつはこのままsendToに突っ込んでも使えると思います。

以下ソースコード↓


—————————————————————————
function makeMov()
{
  // set ffmpeg path
  var ffmpegpath = “ffmpeg”;

  // get arguments
  var filePath = WScript.Arguments(0);
  
  var filePathes = filePath.split( ‘\\’ );
  var fileName = filePathes.pop();
  
  var fileNames = fileName.split( ‘.’ );
  var seqLen = 0;
  fileName = ”;
  for ( var i=0; i<fileNames.length; i++ ) {
    var matchStr = fileNames[i].match( /^[0-9]{2,}$/g );
    if ( matchStr != null ) {
      matchStr = matchStr.toString();
      seqLen = matchStr.length;
      fileName += “%” + seqLen + “d.”;
    } else {
      fileName += fileNames[i];
      if ( i+1 < fileNames.length )
        fileName += “.”;
    }
  }

  filePath = ”
  for ( i=0; i<filePathes.length; i++ )
    filePath += filePathes[i] + “\\”;
  fileName = filePath + fileName;

  if ( seqLen == 0 ) {
    WScript.echo( “This image has no sequence number.” );
    return 0;
  }
  
  var exec = “”;
  exec += ffmpegpath+’ -y ‘;
  exec += ‘-i “‘ + fileName + ‘” ‘;
  exec += ‘-r 30 -s 640×480 -f mov ‘;
  exec += ‘”‘+ filePath +’output.mov”‘;

  // execute command
  var shell = WScript.CreateObject( “WScript.Shell” );
  shell.Run( exec );

  // finish message
  WScript.echo( “Done…” );

}

makeMov();


—————————————————————————

これに、シーケンスファイル(例えば”elemA_color.0001.tif”とか)をドロップしてやると、
ファイル名からシーケンスの長さ(0001なら4)を勝手に読み取って、ffmpegに渡す文字列を生成します。

ただし、すごく適当なので、30fpsの640×480のmovでムービーが作られます。
ビットレートとかコーデックとか指定したいんですが、どうやってやったら良いか良くわかりません。
ビットレートに関しては値がダイレクトじゃなかったので面倒だってことでスルーしました。

movはoutput.movという名前で、ドロップしたシーケンスファイルのある場所に作成されます。

これを動かす前に、ffmpegにパスを通しておいてください。
もしパスを通さない場合は、先頭付近にあるffmpegpathを所定パスに書き換えればOKだと思います。
その際、””で括るのを忘れないでください。””でパスをはさまないとスペースとかが入った場合、動かなくなります。

これもまた便利そうです。
レンダリングの素材チェックなんかで威力を発揮してくれるんじゃないでしょうか。

いずれGUIつけてffmpegのオプションも必要な範囲でいじれるようにして、
PIL + ffmpeg + wxPythonとかで簡単コンポジタとか作ってみたいです。
結局やらないような気もしますが。

———————————————————————–追記
うーん、圧縮tifだと上手く動かないことが判明。
そのほかにもimgcvtで出したsgiとかもOUTだった。
今のところそのぐらいしか調べてないけど、画像形式によってはOUT、ってものがあるっぽい。
動かなかったらファイル形式を変更してみることをオススメします。

うーん、にしてもこれ厄介。
一回コンバートかけたほうが良いのかな。

あとたまにカクンカクンとなる。
これはコマ落ちしてんのかな??

よくわかんないけど、いろいろチューニングしないとちょっと使えないかも。
うーん。

「[ WSH ] ffmpegを利用してmovをつくる。」への4件のフィードバック

  1. 変換君のだと、そもそもTIF不可っですし。
    こちらはレンダリングはIFFか圧縮TIFFなので
    もうみんなまとめてimgcvtでPNG化にしました。

    JPGだと、かなりダイナミックにコマ落ちしていたのですが、
    それもなぜか直りました。

    ただ、PNG変換してimageMagickしてFFmpegだと
    完璧に思った通りのことが出来る代償に
    変換に1パス2−3分かかります。

    で、もうタスクを別マシンに投げちまえとなるわけですね。
    (俺今ココ。結局レンダー管理ソフトを作ることになるわけ)

    さぁ!さっさと追いついて共同作業しようじゃありませんか。

    ちなみにFFmpeg自体は軽いのでmovとFLV両方出すようにしています。そしてFLVplayerは半分くらい出来た。(AS3とmxmlcで完全無料)

    全てがもう少しだ。。。

  2. >hajimeさん
    やっぱりTIF不可ですか、、、
    そしてPNGとの相性がナイスってことですか。

    imageMagickは画像の合成ですかね。

    1パス2-3分ってのはまぁそのぐらいだよね、って納得できる時間ではあると思うんですが、使ってる側としては結構待ってる感じですよねww

    AIRアプリもちょっと興味はあるんですが、
    うーん、僕が今手出すのは幅広げすぎな気が、、

    今はpythonでいっぱいいっぱいです。。

    でもどこかでみんなでソースetcを共有できる場所があると何かと便利だなぁと、最近本当に思います。

    どうにかならんもんですかね。

  3. >imageMagickは画像の合成ですかね。
    作成者名とかプロジェクト名とか連番とか画像に埋め込みます。将来的には簡単な背景との合成ぐらいまでやりたい。

    >1パス2-3分
    今のレンダリング、ひとつレンダリングすると15レンダーパスに分けて出力するんすよ。
    つまりパブリッシュにかかる時間が30分とかなっちゃうんですね。で、4-5カットレンダリングかけてるんですよ。

    ・・・ね。

    >AIRアプリ
    これはやりません。ただのSWFです。
    ブラウザからレンダリング済みのムービーを
    YouTube並みの気楽さで見れるようにしようと。

  4. >hajimeさん
    >imageMagick
    なるほど。そういう使い方が。
    つーかそれ便利ですねー。

    >1パス2-3分
    なるほど。。。
    かといって高速化できるもんでもないですしね、、
    ネットワークで分散、って話になりますねww

    >SWF
    いいですねー。社内Youtubeもどき。
    ブラウザってなんだかんだで便利。

コメントを残す

メールアドレスが公開されることはありません。