FFmpeg拼接单帧图片时视频时长为0的问题求助
我来帮你搞定这个问题——你遇到的核心问题是第一步用了-c copy直接复制流,但拼接单帧图片的时候,这种操作不会给视频添加正确的时间轴信息,导致所有帧的时长被设为0,自然整个视频就没时长了,后面的帧率和变速滤镜也根本起不了作用。
先拆解你原命令的问题
- 第一个命令
ffmpeg -f concat -i List_tb.txt -c copy output.mp4:-c copy是直接复制输入的编码数据,但单帧图片本身没有视频流的时间基、帧率这些关键信息,FFmpeg没法自动生成合理的帧时长,所以输出的output.mp4其实是一堆没有时间戳的帧,时长直接为0。 - 后面的
fps和setpts滤镜在一个时长为0的视频上运行,完全是做无用功——没有可调整的时间轴,滤镜根本发挥不了作用。
解决方案:一步生成正确时长的视频
你不需要分三步操作,用一个命令就能搞定,而且更高效:
ffmpeg -f concat -i List_tb.txt -r 120 -vf "setpts=8.0*PTS" -c:v libx264 final.mp4
命令细节解释:
-r 120:设置输出视频的帧率为120fps,这意味着每张图片默认会停留1/120秒(如果你说的“帧率为帧的数量”是指总帧数对应时长,比如有120张图的话,原时长就是1秒,乘以8倍后就是8秒)-vf "setpts=8.0*PTS":把每帧的时间戳乘以8,相当于把整个视频放慢8倍,时长直接变为原来的8倍-c:v libx264:明确指定用H.264编码器重新编码,这一步很关键——我们不能直接复制图片数据,需要生成带标准时间轴的视频流
如果你坚持分步骤操作(不推荐,但可调整)
如果你还是想分步骤来,那第一步必须去掉-c copy,先生成带正确帧率的视频:
# 第一步:拼接图片并生成带120fps帧率的基础视频 os.system('ffmpeg -f concat -i List_tb.txt -r 120 output.mp4') # 第二步:直接放慢视频8倍得到最终结果 os.system('ffmpeg -i output.mp4 -vf "setpts=8.0*PTS" final.mp4')
这样就跳过了没用的中间output_temp.mp4步骤,而且第一步生成的视频有正常的时间轴,第二步的变速滤镜才能生效。
另外要确认你的List_tb.txt格式是正确的,每一行必须是:
file 'path/to/your/image1.png' file 'path/to/your/image2.png'
注意路径要加引号,而且如果是相对路径的话,要确保FFmpeg能找到这些图片。
内容的提问来源于stack exchange,提问作者iftach freund




