![FFMPEG 转换永远运行](https://linux22.com/image/1544022/FFMPEG%20%E8%BD%AC%E6%8D%A2%E6%B0%B8%E8%BF%9C%E8%BF%90%E8%A1%8C.png)
我正在运行使用 ffmpeg 将图像 + 音频转换为视频的 Web 应用程序,有时有人会上传某些内容,这会导致 ffmpeg 永远在 100% CPU 上运行,直到整个驱动器被填满。
当有人上传一些损坏或奇怪的文件时就会发生这种情况,或者最近我发现当有图像而不是音频时也会发生这种情况(与-loop有关)
ffmpeg -loop 1 -r 1 -i image.jpg -i image2.jpg -vcodec libx264 -acodec copy -xerror -preset ultrafast -r 1 -shortest out.mp4
我知道我可以验证用户输入,但这不应该发生。哪个 ffmpeg 查询可以阻止这种情况,但也会提供相同的文件?
我尝试添加 -stimeout 或 -timeout,但没有作用。
答案1
在给定的命令中,
ffmpeg -loop 1 -r 1 -i image.jpg -i image2.jpg -vcodec libx264 -acodec copy -xerror -preset ultrafast -r 1 -shortest out.mp4
由于没有进行映射分配,ffmpeg 将第一个视频输入映射到输出。由于已设置循环选项,因此它是一个无休止的流。这-shortest
没有效果,因为第二幅图像没有自动映射,因此其持续时间(0.04 秒)无关紧要。
解决方法是添加一个有限的虚拟音频流,创建方式如下 -ffmpeg -f lavfi -t 1 -i anullsrc=cl=mono dummy.m4a
ffmpeg -loop 1 -r 1 -i image.jpg -i image2.jpg -i dummy.m4a -vcodec libx264 -acodec copy -xerror -preset ultrafast -r 1 -shortest out.mp4
这并不能解决“奇怪”文件的问题。
还有一个-timelimit seconds
示例,-timelimit 600
用于在 10 分钟后退出 ffmpeg。但是,这使用系统调用setrlimit
,并且据我所知,Windows 本身不支持,所以我现在无法测试它。