2009-06-30 151 views
8

我想知道如何使用FFMpeg來抓取視頻的中間幀。我已經寫了C#來在特定時間抓取一幀(即在第3秒拉一幀)。但我還沒有弄清楚如何使用FFMpeg命令找到視頻的中間部分。使用FFMpeg獲取視頻的中間幀?

回答

8

這可能是簡化的,但這裏有一些舊的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}"); 
+0

感謝,這正是我一直在尋找! – 2009-07-29 23:08:39

+0

@Derek Gathright請給我一些基本的細節,以開始使用ffmpeg。請看看我的[問題](http://stackoverflow.com/questions/10071408/how-to-get-frames-of-video-file-in-android)。 – 2012-04-25 04:56:46

4

FFmpeg可以幫助您獲得幀率和視頻的長度,因此您可以將一個乘以另一個併除以2以獲得中間幀的編號。

即,對於以15幀/秒運行的30秒視頻:30 * 15 = 450/2 = 225,這意味着您需要抓住第225幀。

0

這個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 
2

假設你正在使用Linux你可以使用ffprobe得到持續,bc計算點半,然後ffmpeg使框架:

eval "$(ffprobe -v error -of flat=s=_ -show_entries format=duration input.mp4)" 
ffmpeg -ss "$(echo "$format_duration/2" | bc)" -i input.mp4 -q:v 2 -frames:v 1 half.jpg 

這消除了任何需要使用awktrgrepsed

或者,你可以使用select filter和消除bc,但選擇濾波器可能會很慢。

大約持續

的說明,如果該文件被損壞或不正確地截斷從ffprobe持續時間可能不正確。持續時間可以通過輸入與ffmpeg則指出在控制檯輸出的第二到最後一行time=完全解碼得到證實:

ffmpeg -i input -f null - 
… 
frame= 2600 fps=569 q=-0.0 Lsize=N/A time=00:01:48.50 bitrate=N/A 
video:244kB audio:20344kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown