コマンドラインからビデオファイルを正確にカット


22

ビデオファイル(avi、mkv、およびmp4が望ましい)を取り、非常に短いクリップ(2〜6秒)を正確な時間精度で切り取ることができるcliアプリケーションを見つけることができません。私が試したのffmpegmencoderのavidemux、およびmp4boxを、彼らは6+秒のクリップを作成するキーフレーム上のすべてのカットけど。入力ファイルを再エンコードして正確な時間をカットするツール、または不正確にカットして再エンコードしてから正確にカットするツールはありますか?


正しくカットするにはカットする前に再エンコードする必要があります。最初に周囲のキーフレームを切り取り、スニペットのみを再エンコードすることにより、おそらく速度を上げることができます。
ライフル

4
どのFFmpegコマンドを試しましたか?前にビデオをデコードする(つまり、-ssパラメーターを配置する -i)場合、より正確になるはずです。
-slhck

1
FFmpegトリックが機能しました!順序がそれほど重要であることに気づきませんでした。これは他のツールでも同じですか?
カーミル

回答:


23

でビデオをカット ffmpeg

あなたは、することができます正確にFFmpegで動画をカット。バージョン2.5以降は非常に簡単です。これは、たとえば、0分、3秒、123ミリ秒から始まる10秒を削減します。

ffmpeg -ss 00:00:03.123 -i input.mp4 -t 10 -c:v libx264 -c:a copy out.mp4

位置と時間は、秒単位またはhh:mm:ss[.xxx]形式のいずれかです。

これらの例では、ビデオはx264エンコーダーを使用して再エンコードされることに注意してください。オーディオがコピーされます。

-to代わりに-tを使用して、期間ではなく終点を指定することもできます。ただし、この場合、の前にを置くことにより、ffmpegは最初にそのポイントをシークしてから出力を開始するため、-toと同等です。-t-ss-i

Seeking wikiエントリも参照してください。


古いffmpegバージョンの正確な切断

ffmpegの古いバージョンを使用している場合、正確なシークのために-ssafter を配置する必要があります-i。これにより、ビデオ全体を最初にデコードする必要があるため、エンコードプロセスが少し遅くなります。

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a copy out.mp4

ここでは-to-t動作が異なります。-t 1010秒の長さのクリップ-to 10を作成しますが、7秒の長さのクリップを作成します。


代わりに、元のファイルと同じコーデックを検出して使用するだけでffmpegに指示-c:v libx264 -c:a libfaacすることができ-acodec copy -vcodec copyます。誰でも確認できますか?
バオダー

2
@Baodadできますが、これは正確にカットされません。ビデオ/オーディオビットストリームをコピーする場合、ffmpegはキーフレームから開始する必要があります。キーフレームは1秒ごとに、またはさらに離れて配置することができます。
slhck

「不明なエンコーダー 'libfaac'」エラーを克服するにはどうすればよいですか?
ダグ

@Dougたとえば、別のエンコーダを選択します-c:a aac -strict experimental。それが最も簡単なソリューションです。
slhck

1

私がこれまでに見つけた唯一のLinuxコマンドラインツールは、正確なフレームで(または、フレーム精度で)カットできますが、meltsudo apt-get install melt)です。

あなたが持っているinputvid.mp4と言う-まず、そのエンコーディング設定をsayで確認してくださいffmpeg(ここでは、再度エンコードしたいと言い-f mp4ますが、ファイルとして/dev/null出力は破棄されます.stderrをリダイレクトして、それを介してgrepすることができます-中央に注意してください、コマンドプロンプトが表示されるyので、Enterキーを押して応答する必要があります。そのため、プロセスが進行し、有用な情報がダンプされます。これはUbuntu 14のffmpeg 3.3.3で行われます。

ffmpeg -i inputvid.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x360 [SAR 1:1 DAR 16:9], 389 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

さて、このビデオのffmpeg選択libx264aacエンコーダーを確認できます。これをforに入力できますmelt

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264

....そしてmelt、フレーム7235と7349の間のピースで新しいファイルにカットしますcut.mp4。次に、cut.mp4ループが正しく行われているかどうかを確認するには、meltもう一度使用して2回再生し、SDLウィンドウで再生します。

melt cut.mp4 cut.mp4 -consumer sdl

...そしてffmpeg、このファイルの内容は次のとおりです。

ffmpeg -i cut.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'    encoder         : Lavf54.20.4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 526 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 182 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

のビデオエンコーディング設定は、ビデオビットレートが389 kb / sから526 kb / sに変更されたcut.mp4ことinputvid.mp4を除いて同じように見えます。また、サンプリングレートが44100から48000 Hzに変更されたことを除いて、オーディオエンコーディング設定はほぼ同じです。ただし、次の方法で規制できます。

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k

...しかし、これでも、最終的なビデオビットレートは337 kb / sになります。それでも、カットはループで再生されたときに正常にループします(オーディオを含む)ので、これは実際にフレーム精度です...


1
meltビデオを再エンコードし、その下のFFmpegライブラリを使用します。再エンコードを許可すると、ffmpegは同じ出力を生成できます。
ギャン

@Gyanに感謝します-それを認識していませんでした(特にmeltFFmpegライブラリを使用しています)。
sdaau

meltはffmpegよりも使いやすいように見えます。必要なのは、適切なフレームに変換する時間、特に時間、分、秒、または時間、分、秒、ミリ秒の時間を指定する方法だけです。
barlop

0

Baodadがコメントで言ったように(すぐに読むと簡単に見つけられないので投稿します)、より良いアプローチはffmpegによってオーディオ/ビデオエンコーダを自動的に検出することです:

ffmpeg -ss 00:05:17.18 -i in.mp4 -t 00:06:29.10 -acodec copy -vcodec copy out.mp4 
  • 開始@ 00:05:17.18
  • 入力= in.mp4
  • @ 00:06:29.10に停止
  • 出力= out.mp4

2
これは再エンコードせず、フレーム精度も提供しません。
アンドレアラザロット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.