[英]Using ffmpeg to change framerate
我正在尝试将视频剪辑(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 命令来完成此操作,而无需重新编码,甚至有些人建议返回原始原始帧。
请帮忙
重新编码:
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
使用新的帧率重新混合
ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4
您可以考虑使用fps
过滤器。 它不会改变视频播放速度:
ffmpeg -i <input> -filter:v fps=fps=30 <output>
将 fps 从 59.6 降低到 30 效果很好。
只需在输入文件之前的“-r”选项中指定所需的帧率:
ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4
选项会影响它们之后的下一个文件。 在输入文件强制重新解释其标头之前的“-r”,就好像视频是以给定的帧速率编码的一样。 无需重新压缩。 有一个小实用程序avifrate.exe可以直接修补 avi 文件头以更改帧速率。 上面的 ffmpeg 命令本质上是一样的,但必须复制整个文件。
一般来说,要将视频的 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
在如何分析文件并检测文件是否为 H.264 视频格式中阅读更多信息?
重新编码:
ffmpeg -y -i input_video.mp4 -vf -r 24 output.mp4
据我所知,如果不重新编码,您无法使用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
显然,此脚本希望当前目录中的所有文件都是媒体文件,但可以轻松更改以将处理限制为您选择的特定扩展名。 请注意,当您解压缩为原始流时,您的文件大小会增加相当大的因素。
您可以使用此命令并且视频时长仍然保持不变。
ffmpeg -i input.mp4 -r 24 output.mp4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.