如何使用FFmpeg实现视频每帧显示1秒 不丢帧不增大文件体积
FFmpeg实现保留全部原始帧、调整单帧显示时长方案
直接使用码流层时间戳修改方案即可,全程不重编码视频帧、不丢帧不插帧、输出文件体积和原文件无差异,最终实现122帧每帧显示1秒、总时长122秒的效果。
可直接使用的命令
ffmpeg -i 你的输入文件路径 -c:v copy -bsf:v setts=pts=N*1/TB,dts=N*1/TB -r 1 -an output.mp4
参数说明
-c:v copy:直接复制原始视频流数据,不对帧内容做任何解码重编码操作,100%保留原始帧信息,不会额外增加文件体积-bsf:v setts=pts=N*1/TB,dts=N*1/TB:通过比特流滤镜直接修改每帧的显示时间戳(PTS)和解码时间戳(DTS),让相邻两帧的时间间隔固定为1秒,整个过程不改动帧本身的画面内容-r 1:将容器层面标记的视频帧率设置为1fps,保证所有播放器都能正确识别播放节奏-an:移除原视频中的音频轨(如果需要保留音频,可去掉该参数,额外添加-c:a aac -filter:a "atempo=0.14"将音频速度匹配到122秒的总时长即可)
注意事项
不要单独使用-r 1参数执行操作,FFmpeg默认的帧同步模式会自动丢弃多余帧或生成插值帧来匹配目标帧率,必须配合上述时间戳修改参数才能保证全部122帧原始帧完整保留。
处理完成后可以用以下命令校验输出文件的帧数,确认结果符合预期:
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames output.mp4
命令返回帧数为122即处理成功,此时视频总时长正好为122秒,每帧固定显示1秒。
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

