![FFmpeg で動画の途中からサムネイルを作成する方法](https://rvso.com/image/1330228/FFmpeg%20%E3%81%A7%E5%8B%95%E7%94%BB%E3%81%AE%E9%80%94%E4%B8%AD%E3%81%8B%E3%82%89%E3%82%B5%E3%83%A0%E3%83%8D%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
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 ,
そして、これをパイプしてawk
duration/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