我有一些用安卓手机录制的视频。它们非常相似。例如:
我对每个过滤器都应用了这个过滤器:
ffmpeg -i original0.mp4 -filter_complex "crop=720:720:280:0, scale=640:640, transpose=1" -threads 3 -preset ultrafast -strict -2 -y processed0.mp4`
结果:
生成的视频没问题。然后我想以不同的组合将它们连接起来,例如:original0 -> original1 -> original2
,original1 -> original0 -> original2
等等。我使用这个命令:
ffmpeg -f concat -i tmp.txt -codec copy -threads 3 -strict -2 -y combination.mp4
processed0.mp4
和的任何组合都processed1.mp4
可以正常工作。但如果我包括processed2.mp4
组合 - 生成的视频就会损坏:
- 组合.mp4(
proccesed0 -> processed1 -> processed2
)
所有视频都以相同的方式以几秒的间隔录制,并且相同的原始视频组合效果很好。所以我想知道original2
或有什么问题processed2
以及如何修复它?也许我需要在应用过滤器时添加一些标志?我猜这是因为时间戳而发生的。
答案1
问题
您的输入的帧速率有所不同(请参阅ffmpeg
控制台输出),并且我相信 MP4 复用器不支持可变帧速率。
一些解决方案
您可以:
对处理后的文件和最终输出使用不同的容器格式,例如 Matroska (.mkv),或者
将过滤器添加
fps
到过滤器图中,以便为每个处理的文件提供通用的帧速率:-filter_complex "crop=720:720:280:0, scale=640:640, transpose=1, fps=30"
其他垃圾
-threads 3
-strict -2
流复制时不执行任何操作()-c copy
。H.264 编码器 libx264 默认会自动计算最佳线程数,因此强制使用特定值可能不是最优的。
如果您选择输出为 MP4,请考虑将其添加
-movflags +faststart
到最终输出命令中。这在通过渐进式下载观看时很有用;否则必须完全下载整个文件才能开始播放。在评论中,您提到分别过滤音频和视频。一个简单的例子可能会有所帮助:
ffmpeg -i input0 -i input1 -filter_complex \ "[0:v]hflip,negate[bg]; \ [1:v]vflip,hue=s=0,scale=120:-1[fg]; \ [bg][fg]overlay[v]; \ [0:a]aphaser,flanger[a]" \ -map "[v]" -map "[a]" -movflags +faststart output.mp4