使用VLC或FFmpeg提取视频中的“每10帧之一”


12

我正尝试出于科学目的提取视频的“每10帧中恰好有1帧”(即提取1,剩下9则重复)。视频为105帧,3.5秒,29.97fps(h.264,.mov,由Nikon D3100制作)。

我已经在这里上传了

VLC

下面的命令应产生10帧,但仅产生6张图像。我尝试了不同的场景比率,但它们都不产生正确的帧数(甚至无法校正)。

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

有人可以告诉我这是什么问题吗?

FFmpeg

FFmpeg似乎没有完全适合我的命令。下面的命令每秒提取3帧,但是由于FPS并非恰好是30(2.97),因此不会为我产生正确的结果。

另外,即使使用此命令,FFmpeg也无法给出正确的帧数。对于3.5秒的视频,我期望最多10帧,但是我得到的是12帧!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

我怎样才能实现自己想要的?


1
BTW -sameq并没有执行您可能认为的操作,并且已从当前版本中删除(真正的ffmpeg,即我不确定它是否在Ubuntu假ffmpeg中)。请改用qscale。
stib 2014年

Answers:


21

每10帧中选择1帧

您可以使用select视频过滤器ffmpeg执行以下操作:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • 对于JPG输出,可以使用改变质量-q:v。有效范围是2(最佳质量)至31(最差质量)。如果要输出到PNG,则不需要此选项。

  • 这将输出img_001.jpgimg_002.jpgimg_003.jpg,等。


看起来非常有趣,但是似乎需要某些特定版本或某些额外的内置代码。我unrecognized option '-filter:v'用“ FFmpeg版本SVN-r0.5.1-4:0.5.1-1ubuntu1.3”(--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect- -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk 2012年

我也无法在ffmpeg Windows N-35709-g7d531e8上运行命令并收到以下错误:[select @ 017EBB00] [Eval @ 0022DC08]缺少')'或'mod(n \,10))'中的参数过多select @ 017EBB00]解析表达式'not(mod(n(,\ 10))'时出错。用args'not(mod(n \,10))'初始化过滤器'select'时出错。打开过滤器时出错!
wmac 2012年

@mivk Ubuntu回购中的FFmpeg版本没有过滤功能。您将必须编译FFmpeg
llogan'2

1
@wmac我猜想Windows不喜欢单引号。将它们更改为双引号:"
llogan'2

1
@LordNeckbeard,谢谢,它运行正确并解决了整个问题。非常感谢您的帮助。
wmac 2012年

4

您问题中最重要的方面是该视频每秒使用29.97帧而不是30。Pesky NTSC。

无论如何,我认为最简单的方法是提取每个帧,然后删除不需要的

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

然后,删除不需要的内容。由于每十分之一帧都将以a结尾1.jpg,因此我们可以将所有其他帧都作为…

find . -maxdepth 1 -not -iname "*1.jpg"

…,一旦您确定要删除这些文件:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

如果可以使用mencoder,你可以尝试的framestep选择,因为解释的文档中,像framestep=10你的情况。我个人无法安装/尝试。


1
非常感谢您的帮助和修改。我尝试了mencoder,甚至那个也有问题!我想这与编解码器或容器有关。ffmpeg使用以下命令精确地提取105帧:ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg%03d.jpg但mencoder仅提取90帧!使用以下命令:mplayer -vo png 1.mov使用framestep = 10也会产生错误的帧数。我对这三个(ffmpeg,vlc和mencoder)无法正确完成如此简单的任务感到震惊。我向VLC网站提交了错误报告。再次感谢。
wmac 2012年

0

如果您要先将视频转换为一系列原始的rgb24或rgb32图像,那么您可能能够获得正确的帧数,因为在原始形式中似乎包含了可能根本不是图像的异常帧类型? ?

在原始的激光光盘中,整个视频是由一系列图像组成的,这些图像的单个帧号为1到100,000或更多,这确实是为将来的转换或操作建立基准的正确方法。

业界已经改变了这种奇怪的压缩思想,只是为了减少支出并破坏处理数字的真实科学形式。

您必须首先将任何音频提取为wave文件,以免完全丢失音频。FFMPEG似乎在每个提取的图像中添加了识别信息,因为如果您尝试将刚刚提取的图像中的图像串在一起,并且将其他来源的具有相同扩展名的其他图像混合在一起,则ffmpeg会忽略您尝试将其切成碎片的图像。

对于激光光盘格式,帧速率仅由显示连续图像的速率决定,而不受图像本身的任何控制。

FFMPEG可能会从科学而不是艺术课程中吸取教训,以正确处理和显示任何类型的图像。或整个视听行业本身。业界确实需要提高硬件功能并使用需要大量内存/存储的原始数据。没有什么能比原始数据更精确,更准确了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.