我的 ffmpeg 输出总是在最后添加额外的 30 秒静音

My ffmpeg output always add extra 30s of silence at the end

这是我用来将 1 个音频和 1 个图像合并为 1 个视频的代码/参数。出于某种原因,无论来源如何,它都会在输出视频的末尾添加 30 秒的静音。

我 运行 在 Win10 x64 上安装了最新的 ffmpeg。 我已经检查了代码,但无法确定它在哪里静音。

ffmpeg -y -loop 1 -framerate 2 -i "some.png" -i "with.mp3" 
-c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest "result.mkv"

输出不应包含额外的 30 秒静音。它应该在音频 运行 结束时结束。

我应该补充一点,我从某个网站复制了大部分参数,而且那个 OP 似乎使用得很好,所以我不确定这是否只是我的问题。

使用

ffmpeg -y -loop 1 -framerate 2 -i "some.png" -i "with.mp3" -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest -fflags +shortest -max_interleave_delta 100M "result.mkv"

容器(AVI、MP4、MKV)通常以交错方式存储多个流,即几秒钟的视频,然后几秒钟的音频,等等。因此 ffmpeg 在写入时缓冲来自所有流的数据。

-shortest 作用在相对较高的级别,并在第一个流完成时触发。但是,来自其他流的缓冲数据仍将写入文件。 -fflags shortest 在较低级别起作用,并在与足够高的 max_interleave_delta 一起使用时停止写入缓冲数据。

当你的帧率太低时,就像人们在将音频与 "poster" 图像合并时试图做的那样,ffmpeg 会遇到问题。
输出的时间是错误的。 “-shortest -fflags +shortest -max_interleave_delta 100M”(虽然它使它变得更好)的输出时间仍然出错,所以我不得不用“-t”命令切断输出。

然后,如果您使用 "ffmpeg -i output.mp4 output-copy.mp4" 抓取输出并复制它,则会引发此问题: “https://trac.ffmpeg.org/ticket/6375?cversion=0
(

Too many packets buffered for output stream 0:1.  
[aac @ 0x7ffda6818c00] Qavg: 65179.457  
[aac @ 0x7ffda6818c00] 2 frames left in the queue on closing  

)
由“-max_muxing_queue_size 9999”解决(输出前,输入后)

同样,如果您将 fps(或“-r”)设置得更高,所有问题都会消失。

查看“max_muxing_queue_size”的 ffmpeg 文档,我得到了一些见解:

-max_muxing_queue_size packets (output,per-stream)

When transcoding audio and/or video streams, ffmpeg will not begin writing into the output until it has one packet for each such stream. While waiting for that to happen, packets for other streams are buffered. This option sets the size of this buffer, in packets, for the matching output stream.

我觉得ffmpeg要同时抓取一个视频帧和很多音频帧,所以需要同时缓冲很多音频帧,不习惯,习惯了到...缓冲这些音频帧的 1/30(30fps),将它们与视频帧连接起来,然后继续。也许吧。

我认为 ffmpeg 应该可以使它更流畅,也许...但是 idk,也许你只需要一劳永逸地阅读所有 ffmpeg 文档。
也许放一些提示,"muxer buffer need to be increased detected, want to raise it? to preset this, see docs for "max_muxer(等)"".
我不知道为什么会出现不正确的输出时间,但是类似的东西。