我的ffmpeg输出总是在末尾增加30秒钟的静音时间

时间:2019-04-22 19:43:54

标签: windows ffmpeg albumart

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

我在装有最新ffmpeg的Win10 x64上运行此文件。 我已经检查了代码,但无法确定导致静音的地方。

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似乎可以很好地使用它,所以我不确定这是否只是我的问题。

2 个答案:

答案 0 :(得分:0)

使用

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一起使用时,将阻止写入缓冲的数据。

答案 1 :(得分:0)

当帧速率太低时,就像将音频与“海报”图像合并时一样,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”)设置得较高,所有的问题就会消失。

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

-max_muxing_queue_size个数据包(输出,每个流)

在对音频和/或视频流进行代码转换时,ffmpeg将不会开始写入输出,直到每个此类流具有一个数据包为止。在等待发生这种情况时,会缓冲其他流的数据包。此选项为匹配的输出流设置此缓冲区的大小(以包为单位)。

我认为ffmpeg必须同时抓取一个视频帧和很多音频帧,因此它需要同时缓冲很多音频帧,并且习惯于这样。 ..缓冲这些音频帧的1/30(用于30fps),将它们与视频帧合并,然后继续。也许。

我认为ffmpeg应该可以更流畅地工作,但... idk,也许您只需要一劳永逸地阅读所有ffmpeg文档。
也许会提示,“检测到需要增加混合器缓冲区,要提高它吗?要进行预设,请参阅“ max_muxer(etc)”文档。”
我不知道为什么会出现错误的输出时间,但是类似的东西。