我在 php 中有一个脚本,它使用 exec() 输出到 ffmpeg - 它从图像和 mp3 创建一个 mp4。
这是我正在执行的命令:
"C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe" -loop 1 -r 0.1 -i image.jpg -i mp3.mp3 -c:v libx264 -preset ultrafast -crf 18 -tune stillimage -c:a copy -filter:v "[in] scale=-1:720, pad=1280:720:640-iw/2 [out]" -shortest out.mp4 -report
在绝大多数情况下,它工作正常,大约需要 5 秒然后结束。但是,ffmpeg.exe 进程时不时地使用 100% CPU '挂起',并且会一直停留在那里直到手动'杀死'。
ffmpeg.exe 似乎没有做任何事情,它创建的 .mp4 不完整并且没有变大,日志文件没有改变,所有文件的修改时间也没有改变。我不知道为什么它使用 100% CPU。
我可以拍摄相同的图像和 mp3 并再次运行它,它会正常工作。
我打开了-report
开关,日志文件中似乎没有任何内容表明它失败且未终止的原因。这是(934 行)日志文件的最后几行,由于某种原因,它似乎在第 10 帧之后停止了:
[libx264 @ 0000000001E37D10] frame= 6 QP=18.00 NAL=2 Slice:P Poc:12 I:0 P:0 SKIP:3600 size=11 bytes
[libx264 @ 0000000001E37D10] frame= 7 QP=18.00 NAL=2 Slice:P Poc:14 I:0 P:0 SKIP:3600 size=11 bytes`
[libx264 @ 0000000001E37D10] frame= 8 QP=18.00 NAL=2 Slice:P Poc:16 I:0 P:0 SKIP:3600 size=11 bytes
[libx264 @ 0000000001E37D10] frame= 9 QP=18.00 NAL=2 Slice:P Poc:18 I:0 P:0 SKIP:3600 size=11 bytes
[libx264 @ 0000000001E37D10] frame= 10 QP=18.00 NAL=2 Slice:P Poc:20 I:0 P:0 SKIP:3600 size=11 bytes`
我尝试使用 Process Explorer 检查挂起的 ffmpeg.exe,但由于它是一个后台进程,我似乎无法找到任何有意义的东西,但也许我在这里遗漏了一些东西 - 有没有办法带来后台进程到前台?
任何想法将不胜感激:-)