FFmpeg で動画の途中からサムネイルを作成する方法

FFmpeg で動画の途中からサムネイルを作成する方法

FFmpeg でビデオのサムネイルを取得する方法はありますか?

一番真ん中のフレームをビデオとして取得し、それをサムネイルとして使用したいと思います。ビデオの長さは不明です。

サムネイルのサイズを指定できる機能も役立ちます。

答え1

1行のコマンド:

ffmpeg -i input.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -ss `ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'` output.jpg

サブコマンドは入力ビデオの合計時間を取得します

ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,

そして、これをパイプしてawkduration/2を計算します。

echo '00:01:30.000' | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'

したがって、これを -ss オプションに秒数で指定すれば完了です。

サイズを指定する場合は、WxH のような -s オプションを追加します。ここで、W と H は整数値です (例: -s 800x600 または -s svga)。または、ffmpeg のマニュアル ページを読んで、使用可能な他のオプションや形式を確認してください。

答え2

以下は使用する方法です:

  • ffprobe期間を取得する
  • bc期間の半分を計算する
  • ffmpegサムネイル画像を作成する

例:

input=input.mp4; ffmpeg -ss "$(bc -l <<< "$(ffprobe -loglevel error -of csv=p=0 -show_entries format=duration "$input")*0.5")" -i "$input" -frames:v 1 half.png

答え3

まず、常に最新バージョンの FFmpeg を使用してください。

PHP にアクセスできる場合、Stack Overflow で質問に対する完璧な回答が得られます。FFMpeg を使用してビデオの中央のフレームを取得しますか?

$output = shell_exec("/usr/local/bin/ffmpeg -i {$path}");
preg_match('/Duration: ([0-9]{2}):([0-9]{2}):([^ ,])+/', $output, $matches);
$time = str_replace("Duration: ", "", $matches[0]);
$time_breakdown = explode(":", $time);
$total_seconds = round(($time_breakdown[0]*60*60) + ($time_breakdown[1]*60) + $time_breakdown[2]);
shell_exec("/usr/local/bin/ffmpeg -y  -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}"; 

FFmpeg の出力から継続時間を抽出し、それを使用して中間フレームのタイムコードを決定します。

これを他のシェルに簡単に適応させることができ、次のコマンドに挿入するだけです。中央のフレームはおよそ534秒です。

ffmpeg -y  -i input.mp4 -f mjpeg -vframes 1 -ss 534 thumbnail.jpg

-s 480x320必要なサイズに応じて、オプションの後のどこかに挿入された または同様のものを使用して、いつでもサイズを変更できます-i input.mp4


上記の解決策は少し不正確です。すぐに結果が表示されますが、必要なフレームを指定することはできません。抽出したいフレームが正確にわかっている場合は、selectフレーム番号などのフィルターを使用します12345

ffmpeg -i input.mp4 -filter:v select="eq(n\,12345)" -vframes 1 thumbnail.jpg

このコマンドは、指定されたフレームまでスキップしてから抽出する必要があるため、時間がかかる場合があることに注意してください。

答え4

簡単な解決策は次のとおりです:

 ffmpeg -i l1.mp4 -ss 00:00:14.435 -vframes 1 out.png

関連情報