Video 使用FFMpeg获取视频的中间帧?

Video 使用FFMpeg获取视频的中间帧?,video,ffmpeg,Video,Ffmpeg,我想知道如何使用FFMpeg来绘制视频的中间帧。我已经写了C#在某个时间抓取一帧(即在第三秒拉一帧)。但是我还没有弄清楚如何使用FFMpeg命令找到视频的中间部分。FFMpeg帮助您获得视频的帧速率和长度,因此您可以将一个乘以另一个,再除以2来获得中间帧的数量 对于以每秒15帧的速度运行的30秒视频:30*15=450/2=225,这意味着您需要抓取第225帧。这可以简化,但这里有一些旧的PHP代码可以实现这一点。(如果该位置不在您的路径中,请将其添加到ffmpeg) 此bash命令的工作方式类

我想知道如何使用FFMpeg来绘制视频的中间帧。我已经写了C#在某个时间抓取一帧(即在第三秒拉一帧)。但是我还没有弄清楚如何使用FFMpeg命令找到视频的中间部分。

FFMpeg帮助您获得视频的帧速率和长度,因此您可以将一个乘以另一个,再除以2来获得中间帧的数量


对于以每秒15帧的速度运行的30秒视频:30*15=450/2=225,这意味着您需要抓取第225帧。

这可以简化,但这里有一些旧的PHP代码可以实现这一点。(如果该位置不在您的路径中,请将其添加到ffmpeg)


此bash命令的工作方式类似于一个符咒(已测试):


使用简单的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

input=input.mp4;ffmpeg-ss“$(bc-l谢谢,这正是我要找的!@Derek Gathright请告诉我开始使用ffmpeg的基本细节。请看一下我的。在Windows/Cygwin上,我不得不对eval/ffprobe的输出进行一次糟糕的文本处理,以消除$format\u duration:
eval结尾的Windows换行符。”$(ffprobe-v error-of flat=s=u-show_entries format=duration tmp.mp4)"
echo$format\u duration>tmp.txt
echo/2>>tmp.txt
dos2unix tmp.txt
format\u duration=
tr-d'\n'
如果有人知道在Windows上使用$format\u duration的更优雅的方法,我很乐意知道。format\u dura后面的变量赋值有一组回跳在我的评论的最后一部分中的注释(这里通过标记解析消除)。希望我能投更多的票。感谢简单的两行。如果视频长度小于两秒,
bc
返回一个没有前导零的数字,例如,
.987
,这会导致一个错误:
对ss:.987
的持续时间规范无效。似乎对
ss
来说,额外的前导零是可以的,所以我要添加ng a
0
此处:
…-ss 0“$(bc…
。另请参见:
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
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