使用ffmpeg更改帧速率

J B*_*and 31 ffmpeg

我正在尝试将视频剪辑(MP4,yuv420p)从30 fps转换为24 fps.帧数是正确的,所以我的输出应该从30fps的20分钟变为24fps的25分钟.其他一切都应该保持不变.

尽量尝试我用ffmpeg尝试的所有内容都会转换帧速率,但会更改帧数以保持相同的持续时间或更改持续时间而不更改帧速率.

所以我一直在尝试这样的事情;

ffmpeg -y -r 30 -i seeing_noaudio.mp4 -r 24 seeing.mp4
Run Code Online (Sandbox Code Playgroud)

(我在Windows上这样做,但通常是在linux上).这会转换帧速率但会丢帧,因此总持续时间不会改变.

或者我试过了

ffmpeg -y -i seeing_noaudio.mp4 -filter:v "setpts=1.25*PTS" seeing.mp4
Run Code Online (Sandbox Code Playgroud)

这改变了持续时间而不是帧率.

当然,我应该可以使用单个ffmpeg命令执行此操作,而无需重新编码,或者甚至有些人建议返回原始原始帧.

请帮忙

Gya*_*yan 37

重新编码:

ffmpeg -y -i seeing_noaudio.mp4 -vf "setpts=1.25*PTS" -r 24 seeing.mp4
Run Code Online (Sandbox Code Playgroud)

无需重新编码:

第一步 - 将视频提取到原始比特流

ffmpeg -y -i seeing_noaudio.mp4 -c copy -f h264 seeing_noaudio.h264
Run Code Online (Sandbox Code Playgroud)

具有新帧率的Remux

ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4
Run Code Online (Sandbox Code Playgroud)

  • 这取决于输入帧速率。PTS系数的基本公式是“(旧速率)/(新速率)”。`-r` 只是新的帧速率。“23.976”、“29.97”和“59.94”的确切值为“24000/1001”、“3000/1001”和“60000/1001”。 (3认同)
  • 如果出现该错误,请**升级** ffmpeg。自 2016 年以来,不再需要该标志。 (3认同)
  • 关于`setpts`的注意事项:要使视频速度加倍:`setpts=0.5*PTS`,要减慢视频速度,您必须使用大于1的乘数:`setpts=2.0*PTS`(速度减半) [参考](https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video) (2认同)

kel*_*lin 33

您可以考虑使用fps过滤器。它不会改变视频播放速度:

ffmpeg -i <input> -filter:v fps=fps=30 <output>
Run Code Online (Sandbox Code Playgroud)

将 fps 从 59.6 降低到 30 效果很好。

  • 为什么使用 fps=fps= 指定关键字两次?谢谢 (5认同)
  • @ch271828n,我从[示例](https://ffmpeg.org/ffmpeg-filters.html#toc-fps-1)中获取它。基本上,第一个“fps”是过滤器的名称,第二个“fps”是输入参数,看起来你也可以跳过它。 (5认同)
  • 这可以使音频与视频保持同步,谢谢 (4认同)
  • 顺便说一句,事实证明您可以使用此命令将 OBS 录制大小减少约 2 倍,而不会牺牲质量或平滑度(如果使用 60fps 更改为 fps=fps=60)。所有其他命令(包括使用 x264/nvenc 尽可能以最佳质量重新编码)都给出了可见的伪影 (2认同)
  • ffmpeg -i &lt;输入视频&gt; -filter:v fps=15 &lt;输出视频&gt; (2认同)

MKa*_*ama 8

只需在输入文件之前的“ -r”选项中指定所需的帧率:

ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4
Run Code Online (Sandbox Code Playgroud)

选项会在它们之后影响下一个文件。输入文件前的“ -r”强制重新解释其标题,就好像视频是以给定的帧率编码的一样。无需重新压缩。有一个小的实用程序avifrate.exe可以直接修补avi文件头以更改帧速率。上面的ffmpeg命令本质上是一样的,但是必须复制整个文件。

  • 对我来说,这根本不会改变输出文件的帧速率。 (6认同)

gsa*_*ras 6

一般来说,要将视频的 FPS 设置为 24,您几乎总是可以执行以下操作:

使用音频且无需重新编码:

# Extract video stream
ffmpeg -y -i input_video.mp4 -c copy -f h264 output_raw_bitstream.h264
# Extract audio stream
ffmpeg -y -i input_video.mp4 -vn -acodec copy output_audio.aac
# Remux with new FPS 
ffmpeg -y -r 24 -i output_raw_bitstream.h264 -i output-audio.aac -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

如果要查找视频格式(本例中为 H264),可以使用 FFprobe,如下所示

ffprobe -loglevel error -select_streams v -show_entries stream=codec_name -of default=nw=1:nk=1 input_video.mp4
Run Code Online (Sandbox Code Playgroud)

这将输出:

h264

如何分析文件并检测文件是否为 H.264 视频格式中阅读更多信息


重新编码:

ffmpeg -y -i input_video.mp4 -vf -r 24 output.mp4
Run Code Online (Sandbox Code Playgroud)


Eld*_*eek 5

据我所知,ffmpeg如果不重新编码,就无法做到这一点。我有一个 24fps 文件,我想要 25fps 来匹配我正在使用的其他一些材料。我使用的命令ffmpeg -i inputfile -r 25 outputfile与 webm、matroska 输入完美配合,并利用编码器生成 h264、matroska 输出:Lavc56.60.100

您可以以 6fps 完成同样的事情,但正如您所指出的,持续时间不会改变(这在大多数情况下是一件好事,否则您将失去音频同步)。如果这不符合您的要求,我建议您尝试这个答案,尽管我的经验是它仍然重新编码输出文件。

为了获得最佳的帧精度,您最好按照之前的建议解码为原始流。我为此使用了一个脚本,如下所示:

#!/bin/bash
#This script will decompress all files in the current directory, video to huffyuv and audio to PCM
#unsigned 8-bit and place the output #in an avi container to ease frame accurate editing.
for f in *
do
ffmpeg -i "$f" -c:v huffyuv -c:a pcm_u8 "$f".avi
done
Run Code Online (Sandbox Code Playgroud)

显然,该脚本期望当前目录中的所有文件都是媒体文件,但可以轻松更改以将处理限制为您选择的特定扩展名。请注意,当您解压缩为原始流时,文件大小将增加相当大的系数。