我正在尝试将 GIF 文件转换为视频,并将输出视频与音频文件合并,因此最终结果将是视频+音频。
public static String makeVideo(String inputGifPath, String outputPath, int width, int height) {
return "-f gif -y -i " + inputGifPath + " -vf crop=" + width + ":" + height + ":0:40,scale=1280:720,setsar=1 " + outputPath;
}
上述代码将输入的 GIF 转换为视频文件,并保持 GIF 的持续时间相同。
我想知道是否有任何方法可以将 GIF 转换为具有特定时间的视频,例如,我希望视频输出循环播放3分20秒
答案1
使用-stream_loop
输入选项:
ffmpeg -stream_loop -1 -i input.gif -i audio.mp3 -vf crop=" + width + ":" + height + ":0:40,scale=1280:720,setsar=1,format=yuv420p -shortest -fflags +shortest -max_interleave_delta 100M -movflags +faststart output.mp4
-fflags +shortest -max_interleave_delta 100M
在这种情况下,可能需要额外的选项。请参阅我的 ffmpeg 输出总是在最后添加额外的 30 秒静音。确保输出帧率不低于 6 左右,否则玩家不会喜欢它。您可以在控制台输出日志中看到输出帧率。否则添加fps 过滤器, 例如
fps=10
。
答案2
@llogan 的答案对我有用,但由于某种原因,它需要很长时间才能完成处理,我使用以下命令结束了此操作:
1 - 将 GIF 转换为视频(与 GIF 文件时长相同)
-f gif -y -i input.gif -vf crop=540:402:0:40,scale=1280:720,setsar=1 gifToVideo.mp4
2 - 循环输出视频 X 次(X == 音频时长/GIF 时长,以秒为单位)
-y -stream_loop xTime -i gifToVideo.mp4 -c copy videoNoSound.mp4
3 - 合并videoNoSound.mp4
和音频文件:
-y -i videoNoSound.mp4 -i audio.mp3 -c:v copy -c:a aac longVideo.mp4
4 - 剪切longVideo.mp4
以匹配音频时长:
-y -i longVideo.mp4 -ss 00:00:00 -t audioDuration -async 1 -c copy finalVideo.mp4