2012年08月06日

ffmpegで複数の動画ファイルを1つにつなげる

 先日、やたらと安いドライブレコーダーを買ったのである。3000円くらいの、こんな感じのドライブレコーダーのうちのひとつである。性能も機能もお値段なりだが、エンジン掛けると勝手に録画開始、エンジン切ると勝手に録画終了なので、案外便利である。

 さて、そのドライブレコーダーはファイル循環式で、最長15分経つと、ファイルが切れて次のファイルに行くようになっている。つまり、まず PICT001.AVI が録画され、15分後に PICT002.AVI に移る、という具合で、1時間走れば4本、2時間走れば8本の動画ファイルができあがる。そこで、このファイルを1つに繋げたいところであるが、動画編集をするソフトを使えばすぐだが、ソフトを買ってまでするほどのことでもないし、編集ソフトでやるのはいちいち操作が必要で面倒。できればコマンドラインでやってしまいたい。
 そこで、フリーのFFmpegを使って、複数の動画ファイルを1つにコンカチする手順。いろいろと試行錯誤の末、次のような手順に落ち着いた。
 
 1. まず、単純結合可能なmpgコンテナに、データを変換する
 例: PICT001.AVI, PICT002.AVI, PICT003.AVI があるとして、
ffmpeg -y -i PICT001.AVI -sameq PICT001.mpg
ffmpeg -y -i PICT002.AVI -sameq PICT002.mpg
ffmpeg -y -i PICT003.AVI -sameq PICT003.mpg

 2. mpg に変換したファイルをつなげる
 Linuxの人は cat でどうぞ。
copy /b PICT*.mpg temp.mpg

 3. このままだとタイムスタンプがおかしいらしいので、修正する
 この状態だと、ファイルの再生時間長などが正しく表示されない(VideoLANなどで見てみると分かる)。次のオプションでもう一度変換すると、正しくなるようである。
ffmpeg -y -i temp.mpg -same_quant -dts_delta_threshold 1 PICTALL.mpg
 
 4. 結合した修正済みデータを、希望のエンコーダーで変換する
 そのまま使うなら別にこのままでもよいが、映像:Xvid 1200k 15fps、音声:mp3 64kbps の例。
ffmpeg -y -i PICTALL.mpg -vcodec libxvid -b:v 1200k -r 15 \
-acodec libmp3lame -ab 64 -ar 44100 \
PICTXVID.avi

 あとは、PHP For Windowsあたりを使ってスクリプトを書けば、D&Dで結合+再変換まで自動で処理できるようになる。
 
[追記]
最近のffmpegのビルドでは、-sameq/-same_quant オプションが削除されているようである。
このときは、-qscale 0 を代わりに指定してやるとよいようだ。
posted by usoinfo at 06:25 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]