我想知道如何使用 FFMpeg 来抓取视频的中间帧。我已经编写了 C# 来在某个时间抓取一帧(即在第 3 秒拉一帧)。但我还没有弄清楚如何使用 FFMpeg 命令找到视频的中间部分。
问问题
9724 次
4 回答
11
这可以被简化,但这里有一些旧的 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}");
于 2009-07-29T05:32:15.283 回答
8
使用简单的 shell 脚本,您可以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、echo
、awk
、tr
、grep
、sed
等的任何需求。
于 2016-01-27T00:11:44.403 回答
4
FFmpeg 帮助你得到视频的帧率和长度,所以你可以一个乘另一个除以 2 得到中间帧的个数。
即对于以每秒 15 帧运行的 30 秒视频:30 * 15 = 450 / 2 = 225,这意味着您需要抓取第 225 帧。
于 2009-06-30T23:45:18.753 回答
-1
这个 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
于 2014-11-09T17:08:36.013 回答