質問

私は、ビデオの中枠をGRAPするFFMPEGを使用する方法を思ったんだけど。私はすでに(すなわち秒3で1つのフレームを引く)特定の時間にフレームをつかむためにC#を書きました。しかし、私はffmpegのコマンドを使用してビデオの真ん中を見つける方法を把握したことはありません。

役に立ちましたか?

解決

このを簡略化することができますが、ここではトリックを行う必要があり、私はその周りに横たわっていたいくつかの古いPHPコードがあります。 (それはあなたのパスにない場合はffmpegのために場所を追加)

$output = shell_exec("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("ffmpeg -y  -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}");   

他のヒント

FFmpegのは、あなたがミドルフレームの数を取得するために2によって他と除算で1を掛けることができますので、あなたは、フレームレート、ビデオの長さを得ることができます。

30秒のビデオのためのすなわち、毎秒15のフレームで実行されている:30 * 15 = 2分の450 = 225、あなたは225番目のフレームを取得する必要があり意味

簡単なシェルスクリプトを使用すると、機械読み取り可能な期間出力、半分のポイントを計算するための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

これはPHP、echoawktrgrepsed、などの必要がなくなります。

このbashコマンドは、魔法のように動作します(テスト):

avconv -i 'in.mpg' -vcodec mjpeg -vframes 1 -an -f rawvideo -s 420x300 -ss avconv -i in.mpg 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}' out.jpg
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top