使用ffmpeg更改帧速率

时间:2017-08-02 13:47:02

标签: ffmpeg

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

尽我所能尝试使用ffmpeg尝试转换帧速率但改变帧数以保持相同的持续时间或更改持续时间而不改变帧速率。

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

ffmpeg -y -r 30 -i seeing_noaudio.mp4 -r 24 seeing.mp4

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

或者我试过

ffmpeg -y -i seeing_noaudio.mp4 -filter:v "setpts=1.25*PTS" seeing.mp4

这会改变持续时间而不是帧速率。

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

请帮助

6 个答案:

答案 0 :(得分:30)

重新编码:

ffmpeg -y -i seeing_noaudio.mp4 -vf "setpts=1.25*PTS" -r 24 seeing.mp4

无需重新编码:

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

ffmpeg -y -i seeing_noaudio.mp4 -c copy -f h264 seeing_noaudio.h264

Remux with new framerate

ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4

答案 1 :(得分:5)

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

ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4

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

答案 2 :(得分:2)

通常,要将视频的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

如果要查找视频格式(在这种情况下为H264),则可以使用FFprobe,像这样

ffprobe -loglevel error -select_streams v -show_entries stream=codec_name -of default=nw=1:nk=1 input_video.mp4

它将输出:

h264

How can I analyze file and detect if the file is in H.264 video format?中阅读更多内容


使用重新编码:

ffmpeg -y -i input_video.mp4 -vf -r 24 output.mp4

答案 3 :(得分:0)

据我所知,如果不重新编码,就无法使用ffmpeg进行此操作。我有一个24fps的文件,希望以25fps的速度与我正在使用的其他材料相匹配。我使用了ffmpeg -i inputfile -r 25 outputfile命令,该命令与webm,matroska输入完美配合,并使用编码器Lavc56.60.100

生成了h264,matroska输出

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

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

#!/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

很明显,此脚本希望当前目录中的所有文件均为媒体文件,但可以轻松更改以将处理限制为所选的特定扩展名。请注意,将文件解压缩为原始流后,文件大小将增加相当大的比例。

答案 4 :(得分:0)

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

ffmpeg -i <input> -filter:v fps=fps=30 <output>

将fps从59.6降低到30很好。

答案 5 :(得分:-1)

您可以使用此命令,并且视频时长仍保持不变。

ffmpeg -i input.mp4 -r 24 output.mp4