请求ffmpeg以原始帧率提取帧。

7
在FFmpeg文档(这里这里)中,我看到默认情况下FFmpeg选择每秒提取25帧(否则您可以使用-r选项指定帧速率)。
我的问题是,我有一个包含数十个视频的文件夹,每个视频的记录帧率都不同,因此我的问题是:
是否有一种方法可以要求FFmpeg以原生帧速率(即视频录制时的原始帧速率)从视频中提取帧?
如果相关的话,我正在使用MP4文件。

这是一个更好的答案,不需要指定帧率:https://stackoverflow.com/questions/50420985/ffmpeg-not-extracting-all-the-frames-from-a-video - David Parks
1个回答

3
为了获取原始帧率:
ffmpeg -i file.mp4 2>&1 | grep -o '[0-9]\{1,3\}\sfps'

示例输出:

25 fps

您可以进一步将其传输到 sed ... | sed 's/\sfps//',只保留25,并将其存储到变量中,因此您可以使用该变量转换视频,例如:ffmpeg -r $originalFpsgrep -o将提取匹配项,而不是包含匹配项的整行。 [0-9]\{1,3\}将匹配1至3个数字。 \sfps将匹配一个空格后跟'fps'。

谢谢Eric。出于某种原因,我无法使用grep处理ffmpeg的输出。我尝试了带和不带2>&1的命令。就好像我从ffmpeg在终端上得到的输出不能被管道传输(但是其他命令却可以)。 - Amelio Vazquez-Reina
没事了,我觉得现在它正在工作。重定向2>&1的目的是什么?我以前见过它。你知道为什么ffmpeg需要它吗? - Amelio Vazquez-Reina
@intrpc grep无法解析stderr,因此您需要重定向,或者您可以使用|&代替2>&1 - Eric Fortis
顺便说一下,为了澄清,在我的电脑上,ffmpeg(版本SVN-r14102)不会在syntax # fps的子字符串中输出帧速率。相反,我得到的是类似于29.92 tb(r)的东西。尽管如此,像你所指出的那样,通过将输出传输到grep中进行解析仍然可以用于此操作。顺便问一句,为什么我需要在正则表达式中使用\s?我只需使用grep -o '[0-9.]\{1,5\} tb(r)'(即在正则表达式中使用实际空格)即可获取输出。 - Amelio Vazquez-Reina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接