打印警告后 FFmpeg 卡住:EOF 时间戳不可靠

FFmpeg gets stuck after printing Warning : EOF timestamp not reliable

我正在尝试创建一个视频,其中包含一组不同的输入,其中包括一组图像序列,以及一些其他图像和一个视频(可能不止一个)以覆盖在这些图像之上。

最终视频输出的持续时间应该等于最长输入的持续时间(而较短的输入只会循环到该持续时间)。

虽然该命令在大多数情况下都有效。在某些情况下,我看到警告 EOF timestamp not reliable,然后 FFmpeg 卡住 indefinately.This 发生在某些特定的输入情况下,并且似乎也随着 ffmpeg 的不同版本而变化,我尝试使用 ffmpeg 版本 4.1、4.0.4 和 3.4.1。它似乎只适用于 4.0.4,而在其他版本上则失败。

我正在分享一个示例命令以及 windows 的资产,为此我遇到了这个问题

命令如下:

    ffmpeg -i assets\w_re_p_3\w_re_p_3_%d.jpg -loop 1 -i assets\text_0.png -loop 1 -i assets\text_1.png -loop 1 -i assets\text_2.png -loop 1 -i assets\text_3.png -loop 1 -i assets\text_4.png -loop 1 -i assets\text_5.png -loop 1 -i assets\text_6.png -loop 1 -i assets\text_7.png -lavfi "[0:v]loop=loop=-1:size=121:start=1[lip0];[1:v]scale=w=693:h=155[si_1];[lip0][si_1]overlay=x=13:y=13:shortest=1[over_0];[2:v]scale=w=693:h=45[si_2];[over_0][si_2]overlay=x=13:y=871:shortest=1[over_1];[3:v]scale=w=693:h=155[si_3];[over_1][si_3]overlay=x=13:y=236:shortest=1[over_2];[4:v]scale=w=693:h=40[si_4];[over_2][si_4]overlay=x=13:y=1089:shortest=1[over_3];[5:v]scale=w=693:h=84[si_5];[over_3][si_5]overlay=x=13:y=1141:shortest=1[over_4];[6:v]scale=w=693:h=31[si_6];[over_4][si_6]overlay=x=13:y=1207:shortest=1[over_5];[7:v]scale=w=693:h=85[si_7];[over_5][si_7]overlay=x=13:y=982:shortest=1[over_6];[8:v]scale=w=693:h=52[si_8];[over_6][si_8]overlay=x=13:y=148:shortest=1[over_7];movie=filename=assets\\cmedia_cropped.mp4:loop=1,setpts=N/(FRAME_RATE*TB)[mov_0];[mov_0]scale=w=720:h=487[sm_0];[over_7][sm_0]overlay=x=0:y=357:shortest=1" card_output.mp4

以下是命令中使用的所有资产的link:

https://www.dropbox.com/sh/6bwo4fg5de3fjwz/AAA471jUtLZGtti3hakT1bgfa?dl=0

最终输出应如下所示:

https://www.dropbox.com/s/s92t6qij2lrl2j7/card_output1.mp4?dl=0

拜托,我不明白背后的原因。无论如何我可以改进我的命令,这样我就不必面对这个问题。任何帮助将不胜感激。

问题似乎出在命令的这一部分[0:v]loop=loop=-1:size=121:start=1[lip0]

出于某种未知原因,FFmpeg 没有无限循环遍历我的输入图像集,相反,它只循环一次。如果我改为设置 loop=(any +ve number) 那么它工作正常。

FFmpeg 卡住了,因为图像集的持续时间(25 fps)小于电影过滤器中视频的持续时间(movie=filename=assets\\cmedia_cropped .mp4:loop=1,setpts=N/(FRAME_RATE*TB)[mov_0]), 这似乎是 FFmpeg 本身的一个错误,因为在文档中清楚地写了-1 将导致无限循环,但在这种情况下不会发生这种情况。

https://ffmpeg.org/ffmpeg-all.html#loop