2012/09/01

簡易ビデオ編集機能(ツール編)

番組取得/予約/録画/視聴までを色んなツールやサーバーシステムを組み合わせて構築して、当初やりたかったことはほぼ出来たと思う。何かやり残したことはないかな?と考えながら録画されたビデオを視聴していたら・・・

なんと!音が思いっきりずれているやつがあるじゃないか。それも保存しておきたい今年のオリンピック閉会式。しかも途中ドラマとかが挟まってるし。
これはこのままじゃだめでしょ。ということで編集することにした。

最初はマックに持ってきてiMovieでやるか?と思った。2時間程度のビデオファイルをインポートに数時間かかった。こりゃだめだ。(我が家のマックは初代iMacなので非力なのだ)

ならば、どうせならウェブベースのビデオ編集機能を作ってみようと思った。
YouTube Video Editorみたいなすごいのは無理だけど、音ずれと前後カットくらいなら既存ツールの組み合わせで出来るんじゃないかな?と思った。
実際それだけでも結構苦労した。

今回はその構築の中のビデオ関連ツール部分の話

最初音ずれ編集は以前の記事のようにsoxでやろうかなと思った。
mp4(H264,aac)からaudioをwaveにデコードしてsoxかけてまたaacにしてマージ?

うーん。時間かかりそうだし音も劣化してしまいそうだ。直接出来ないかな?せめてaacのまま出来ないかな?
そう思って調べてみると、libsox-fmt-ffmegを使うとsoxがffmpegのライブラリを使って読み書きが出来るらしい。aacも扱えるらしい。そのためにはsoxが--with-ffmpegでビルドされている必要があるらしい。ソース取得からやってみた。

$ git clone git://sox.git.sourceforge.net/gitroot/sox/sox
$ autoreconf -i
$ ./configure -help
みると、--with-ffmpegがあった。--with-ffmpeg=dyn ?なんだこれ?
$ sudo apt-get install libsox-fmt-ffmpeg


その後いろいろとconfigureと--with-ffmpegと格闘したものの。ffmpegはyesになったが、フォーマットのffmpegはnoだ。実際ビルドされたsoxにaacファイルやmp4ファイルを与えてみたが知らぬフォーマットだと言われる。情報も乏しく、進展しそうにないのでsoxを利用するのは諦める。

もっといい方法があった。MP4Boxを使うことだ。

既にエンコード処理に組み込んでいるツールだったが、ipod対応のためのツールくらいにしか思ってなくて、ちゃんと調べたことがなかった。
すばらしいことに、mp4(h264+aac)ファイルがそのまま扱える。

MP4Boxでディレイ処理

$ MP4Box -delay {track#}={time msec} v.mp4 -out vv.mp4
これで、v.mp4内の指定トラックをtime(msec)分遅らせたビデオファイルをvv.mp4として出力できる。音声トラックは2番なので
$ MP4Box -delay 2=1500 v.mp4 -out vv.mp4
で、音を1.5秒遅らせたvv.mp4が出来上がる。

トラック1=ビデオ、トラック2=オーディオと決まっているわけじゃないけど、普通にエンコードして作ったビデオファイルはそういうものと決めつけても問題なし。

こんな書き方も出来るようだ。
$ MP4Box -add v.mp4#video -add v.mp4#audio:delay=1500 -new vv.mp4
videoとaudioを別ファイルから読んでマージした新しいファイルvv.mp4を作る。
同時に音声にdelayオプションを付けて遅らせるってことが同時に出来る。

ただ、これで作ったビデオファイルをhtml5のvideoタグで再生するとコントローラのタイムスライダーでの頭出し操作が出来なくなった。必要なchunkがなくなってしまうのだろうか。なのでこっちの書き方は採用しなかった。

MP4Boxでカット(スプリット)処理

$ MP4Box -add v.mp4:dur=60 -new vv.mp4
で、最初の60秒間だけをvv.mp4にする事が出来る。

$ MP4Box -split-cunk S:E src.mp4
で、S(sec)からE(sec)までにクリップできる。src_S_E.mp4というファイルが出来る。
SとEは秒数。こっちはなぜか、-outオプションで出力ファイル名を指定できない。

chunk単位でのスプリットらしいので指定秒数がぴったりじゃない場合、指定通りのファイル名にならない。split-chunk 10:20ってやっても、v_6_20.mp4とかになる。
出力ファイル名が特定しにくいのが難点だが、やりたいことはこれなので何とかする。


以上をふまえて
  • プレビュー用のショートムービー生成
    • $ MP4Box -add v.mp4:dur=60 -new vv.mp4
  • video/audioディレイ処理
    • $ MP4Box -delay #TRACK=#TIME v.mp4 -out vv.mp4
  • 前後クリップ処理
    • $ MP4Box -split-cunk #StartTime:#EndTime v.mp4
      → v_#StartTime_#EndTime.mp4っぽいファイルが出来上がる
で、やりたい編集処理は出来そうだ。実際やってみると結構高速だ。
2時間程度のファイルを数分で処理できる。使える使える。

これで内部タスク処理はいけそうなので、後はフロントエンドのコントローラとフォームビューを作って値の設定とビデオの確認が出来るように。実行タスクはJenkinsジョブで実行させて、結果をビューに反映させるって感じかな。

言うは易し。結構めんどかった。次回はその辺の構築を2、3回に分けて記載予定。

0 件のコメント:

コメントを投稿