†ぽんこつビデオ工房†

部分切り出し 指定の位置から指定の長さだけ切り出す

作成開始日 2018.09.10
最終更新日 2022.05.26

[開始位置]と[長さ]で指定

構文)ffmpeg -ss 開始位置 -i 入力ファイル名 -t 長さ -c copy 出力ファイル名
[開始位置]も[長さ]も基本的に秒数指定だが、[hh:mm:ss]形式で[時:分:秒]指定も可能。また、入力/出力ファイルのコーデックとコンテナは統一しておくことが望ましい(-c copyが指定できるので)。
用例)ffmpeg -ss 53:20 -i stand-by.mp3 -t 21.5 -c copy 綾音理沙おでん.mp3
この例では「stand-by.mp3」と言う音声ファイルの53分20秒の位置から21.5秒分切り出している。ちなみに、これは『森本毅郎スタンバイ』で流れた佐倉綾音と種田理沙のセブンイレブンのCMを切り出したときの操作 (^^ゞ

なお、「-ss」は入力ファイルの前「-t」は入力ファイルの後に指定すること。ffmpegではオプションの指定順序は基本的に不可換。

[開始位置]と[終了位置]で指定

上記では[開始位置]と[長さ]を指定して切り出しを行ったが、[開始位置]と[終了位置]で指定する方法もある。「-ss」と「-t」を別々に指定して、変換を2回掛ければよい。
ffmpeg -i 入力ファイル名 -t 終了位置 一時ファイル名
ffmpeg -ss 開始位置 -i 一時ファイル名 出力ファイル名
【用例】「inp.mp3」の「15秒〜3分30秒」部分(長さ3分15秒)を切り出して「out.mp3」とする
ffmepg -i inp.mp3 -t 3:30 -c copy temp.mp3
ffmepg -ss 15 -i temp.mp3 -c copy out.mp3
先に[終了位置]を指定して一時ファイルを作成するのがミソ。これによって、[長さ]指定がそのまま[終了位置]指定になる。

先に[開始位置]を指定してしまうと、[終了位置]=[長さ]−[開始位置]となり、時間計算が必要になる。バッチでhh:mm:ss形式の演算処理はかなり面倒臭い。

ただし、この方法では変換が2回必要で、しかも中間の一時ファイルを作成する必要もある。何とか1行で収まらないかと、オプションの記述位置を変えていろいろと試してみたが、残念ながら1行では無理だった。

「-to」オプションによる終了位置指定

ところで、ffmpegには「-to」というオプションが存在する。これがまさに[終了位置]を指定するオプションで、実はこれを使えば、1行で切り出し処理が可能になる。じゃあ、最初からそれを使えばいいじゃん、と言うハナシになるのだが、このオプションはどうもマイナーなようで、ネットで検索しても資料が少ない。その少ない資料もあまりアテにならないようで、なかなか思い通りに機能してくれない。ちなみに、以下のような常識的な記述は通用しない。
× ffmpeg -ss 開始位置 -i 入力ファイル名 -to 終了位置 出力ファイル名
この指定では、「-to」が「-t」と同じ機能になっているカンジなのだ。やはり、[終了位置]が[開始位置]よりも前にないとダメなようなのだが、だからと言って;
× ffmpeg -to 終了位置 -ss 開始位置 -i 入力ファイル名 出力ファイル名
とすると、今度はエラーが出て止まってしまうorz 結局、私が成功したのは;
○ ffmpeg -i 入力ファイル名 -to 終了位置 -ss 開始位置 出力ファイル名
これで一応、意図通りの処理をしてくれるようになった。ただし、ffmpegでは「-ss」は「-i」よりも前に指定するのがセオリーのはず。そう考えると、ちょっと気持ちの悪い指定だ。

【参考】秒単位で指定する場合は+1
[開始位置]や[終了位置]をミリ秒単位で指定する場合は、そのままの数値を指定すればよい。しかし、秒単位で指定する場合は、値に「+1」しておくことを推奨。たとえば、「10秒〜30秒」の間を切り出したければ、開始位置は「11秒」、終了位置は「31秒」とする。秒指定では1秒以下の端数が切捨てられるため、[開始位置]には前のデータが微妙に残り、[終了位置]では末尾のデータが微妙に足りなくなる可能性がある。


【ぽんこつビデオ工房目次】 【ホーム】