这是我用来将 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使用时阻止写入缓冲数据。
当您的帧速率太低时,就像将音频与"海报"图像合并时会这样做一样,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 个数据包(输出,每个流)
对音频和/或视频流进行转码时,ffmpeg 不会开始写入输出,直到每个此类流都有一个数据包。在等待发生这种情况时,将缓冲其他流的数据包。此选项为匹配的输出流设置此缓冲区的大小(以数据包为单位)。
我认为 ffmpeg 必须同时抓取一个视频帧和大量音频帧,因此它需要同时缓冲大量音频帧,并且不习惯,它习惯了......缓冲这些音频帧的 1/30(对于 30fps),将它们与视频帧连接起来,然后继续。或。
我认为 ffmpeg 应该可以更顺利地工作......但是idk,也许你只需要一劳永逸地阅读所有的ffmpeg文档,
也许放一些提示,"muxer缓冲区需要增加检测,想提高它吗?要预设此设置,请参阅"max_muxer(等)"的文档。
我不知道为什么存在不正确的输出时间,但类似的东西。