はじめに
片道2時間ほどのお出かけをしました。
ドライブレコーダーで撮影した映像を手間をかけずに編集したいのですが、
厄介なことに1分毎に1ファイルになっていて非常に扱いづらいです。
私たちの味方、ffmpegちゃんをこき使ってなんとかしましょう。
やりたい事
- 動画は5倍速に変換したい
- 動画は1つのファイルに結合したい
- 100ファイル以上なのでバッチ処理したい
条件の整理
必要なファイル | Path |
---|---|
ffmpeg.exe | C:\Program Files (Freesoft)\ffmpeg\bin |
inputファイル | F:\temp\input\*.mp4 |
outputフォルダ | F:\temp\output |
2倍速に変換する
変換したい動画ファイル(*.mp4)をinputフォルダに入れて、下記バッチ処理を conv.bat に保存して起動します。
@echo off
cd /d "F:\temp\input\"
for %%a in (*.mp4) do (
"C:\Program Files (Freesoft)\ffmpeg\bin\ffmpeg.exe" -i F:\temp\input\%%a -vf setpts=PTS/2.0 -af atempo=2.0 F:\temp\output\%%a_x2.mp4
)
cdでカレントディレクトリを変更し、そのディレクトリ内の *.mp4 というファイル全てに対してループ処理
setpts=PTS/2.0 映像を2倍速に変換
atempo=2.0 音声を2倍速に変換
5倍速に変換する
@echo off
cd /d "F:\temp\input\"
for %%a in (*.mp4) do (
"C:\Program Files (Freesoft)\ffmpeg\bin\ffmpeg.exe" -i F:\temp\input\%%a -vf setpts=PTS/5.0 -af atempo=2.0, atempo=2.0, atempo=1.25 F:\temp\output\%%a_x2.mp4
)
atempoは2.0までしか処理できないので、複数重ねて5倍速に変換します(2.0×2.0×1.25=5倍)
3倍:atempo=2.0, atempo=1.5
4倍:atempo=2.0, atempo=2.0
5倍:atempo=2.0, atempo=2.0, atempo=1.25
6倍:atempo=2.0, atempo=2.0, atempo=1.5
7倍:atempo=2.0, atempo=2.0, atempo=1.75
8倍:atempo=2.0, atempo=2.0, atempo=2.0
- ffmpegのコマンドは下記を参考にしました。
ffmpegを使って動画の再生速度を変えてみる
動画を1つに結合する
- こちらに関しては素晴らしい記事がありました。
ffmpegでmp4ファイルを結合するバッチファイル
さいごに
やったー!これで5倍速の1ファイルになったぞー!・・・と思って再生してたらキッチリ12秒毎にカクツク事に気付く。
つまり動画と動画を結合した所で何かが起きていると思い調べた結果がこちらです。
事実:n倍速に変換した際に、動画の末尾数フレームが欠落している
推測:変換時の剰余フレームは削除される為、動画の末尾で余りフレームを削除して調整されている
(フレーム数は整数になる為)
なんということでしょう・・・
対策として先に結合してから5倍速に変換しました・・・
これ何とか出来るんでしょうか。力尽きたのでここまでにします。