FFMPEG “buffer queue overflow, dropping” があらぬパターンで起こる話

なんなのよ。

一つ前のネタの最後の追記で書いたヤツ:

 1 #! /bin/sh
 2 
 3 ffmpeg -y -i "1.mp4" -i "2.mp4" -i "3.mp4" -i "4.mp4" -filter_complex "
 4 color=c=black:s=960x540:d=6.136[prepadv0];
 5 sine=frequency=0:sample_rate=44100:d=6.136 [prepada_l0];
 6 sine=frequency=0:sample_rate=44100:d=6.136 [prepada_r0];
 7 [prepada_l0][prepada_r0]amerge=inputs=2[prepada0];
 8 [0:v]scale=960:540[v0];
 9 [prepadv0][v0] concat=n=2:v=1:a=0 [vc0];
10 [prepada0][0:a] concat=n=2:v=0:a=1 [ac0];
11 
12 [1:v]scale=960:540[v1];
13 color=c=black:s=960x540:d=0.496[postpadv1];
14 sine=frequency=0:sample_rate=44100:d=0.496 [postpada_l1];
15 sine=frequency=0:sample_rate=44100:d=0.496 [postpada_r1];
16 [postpada_l1][postpada_r1]amerge=inputs=2[postpada1];
17 [v1][postpadv1] concat=n=2:v=1:a=0 [vc1];
18 [1:a][postpada1] concat=n=2:v=0:a=1 [ac1];
19 
20 color=c=black:s=960x540:d=13.218[prepadv2];
21 sine=frequency=0:sample_rate=44100:d=13.218 [prepada_l2];
22 sine=frequency=0:sample_rate=44100:d=13.218 [prepada_r2];
23 [prepada_l2][prepada_r2]amerge=inputs=2[prepada2];
24 [2:v]scale=960:540[v2];
25 color=c=black:s=960x540:d=13.778[postpadv2];
26 sine=frequency=0:sample_rate=44100:d=13.778 [postpada_l2];
27 sine=frequency=0:sample_rate=44100:d=13.778 [postpada_r2];
28 [postpada_l2][postpada_r2]amerge=inputs=2[postpada2];
29 [prepadv2][v2][postpadv2] concat=n=3:v=1:a=0 [vc2];
30 [prepada2][2:a][postpada2] concat=n=3:v=0:a=1 [ac2];
31 
32 color=c=black:s=960x540:d=6.095[prepadv3];
33 sine=frequency=0:sample_rate=44100:d=6.095 [prepada_l3];
34 sine=frequency=0:sample_rate=44100:d=6.095 [prepada_r3];
35 [prepada_l3][prepada_r3]amerge=inputs=2[prepada3];
36 [3:v]scale=960:540[v3];
37 color=c=black:s=960x540:d=5.151[postpadv3];
38 sine=frequency=0:sample_rate=44100:d=5.151 [postpada_l3];
39 sine=frequency=0:sample_rate=44100:d=5.151 [postpada_r3];
40 [postpada_l3][postpada_r3]amerge=inputs=2[postpada3];
41 [prepadv3][v3][postpadv3] concat=n=3:v=1:a=0 [vc3];
42 [prepada3][3:a][postpada3] concat=n=3:v=0:a=1 [ac3];
43 
44 [vc0][vc1]hstack[1v];
45 [vc2][vc3]hstack[2v];
46 [1v][2v]vstack[v];
47 [ac0][ac1][ac2][ac3]
48 amerge=inputs=4,
49 pan=stereo|\
50     c0 < c0 + c4   +   0.2 * c2 + 0.2 * c6 |\
51     c1 < c3 + c7   +   0.2 * c1 + 0.2 * c5
52 [a]
53 " -map '[v]' -map '[a]' -ac 2 \
54   "merged.mp4"

これはまったくもって意図通りのものが出来上がる。

して、ほかの4つに適用しようと:

間違い探し
 1 #! /bin/sh
 2 
 3 ffmpeg -y -i "1.mp4" -i "2.mp4" -i "3.mp4" -i "4.mp4" -filter_complex "
 4 color=c=black:s=960x540:d=20.968[prepadv0];
 5 sine=frequency=0:sample_rate=44100:d=20.968 [prepada_l0];
 6 sine=frequency=0:sample_rate=44100:d=20.968 [prepada_r0];
 7 [prepada_l0][prepada_r0]amerge=inputs=2[prepada0];
 8 [0:v]scale=960:540[v0];
 9 color=c=black:s=960x540:d=4.452[postpadv0];
10 sine=frequency=0:sample_rate=44100:d=4.452 [postpada_l0];
11 sine=frequency=0:sample_rate=44100:d=4.452 [postpada_r0];
12 [postpada_l0][postpada_r0]amerge=inputs=2[postpada0];
13 [prepadv0][v0][postpadv0] concat=n=3:v=1:a=0 [vc0];
14 [prepada0][0:a][postpada0] concat=n=3:v=0:a=1 [ac0];
15 
16 [1:v]scale=960:540[v1];
17 
18 color=c=black:s=960x540:d=26.819[prepadv2];
19 sine=frequency=0:sample_rate=44100:d=26.819 [prepada_l2];
20 sine=frequency=0:sample_rate=44100:d=26.819 [prepada_r2];
21 [prepada_l2][prepada_r2]amerge=inputs=2[prepada2];
22 [2:v]scale=960:540[v2];
23 color=c=black:s=960x540:d=11.821[postpadv2];
24 sine=frequency=0:sample_rate=44100:d=11.821 [postpada_l2];
25 sine=frequency=0:sample_rate=44100:d=11.821 [postpada_r2];
26 [postpada_l2][postpada_r2]amerge=inputs=2[postpada2];
27 [prepadv2][v2][postpadv2] concat=n=3:v=1:a=0 [vc2];
28 [prepada2][2:a][postpada2] concat=n=3:v=0:a=1 [ac2];
29 
30 color=c=black:s=960x540:d=29.396[prepadv3];
31 sine=frequency=0:sample_rate=44100:d=29.396 [prepada_l3];
32 sine=frequency=0:sample_rate=44100:d=29.396 [prepada_r3];
33 [prepada_l3][prepada_r3]amerge=inputs=2[prepada3];
34 [3:v]scale=960:540[v3];
35 color=c=black:s=960x540:d=2.594[postpadv3];
36 sine=frequency=0:sample_rate=44100:d=2.594 [postpada_l3];
37 sine=frequency=0:sample_rate=44100:d=2.594 [postpada_r3];
38 [postpada_l3][postpada_r3]amerge=inputs=2[postpada3];
39 [prepadv3][v3][postpadv3] concat=n=3:v=1:a=0 [vc3];
40 [prepada3][3:a][postpada3] concat=n=3:v=0:a=1 [ac3];
41 
42 [vc0][v1]hstack[1v];
43 [vc2][vc3]hstack[2v];
44 [1v][2v]vstack[v];
45 [ac0][ac1][ac2][ac3]
46 amerge=inputs=4,
47 pan=stereo|\
48     c0 < c0 + c4   +   0.2 * c2 + 0.2 * c6 |\
49     c1 < c3 + c7   +   0.2 * c1 + 0.2 * c5
50 [a]
51 " -map '[v]' -map '[a]' -ac 2 \
52   "merged.mp4"

これが Buffer queue overflow, dropping. を起こす。

「フレームを drop したぜっ」は普段は「少なくとも人間の目・耳ではわからない」問題しか起こさないが、こいつの場合は全然ダメで、滅茶苦茶な動画が出来上がる。なので無視できない。

運がよくなかったのは、今回のこの4つ、うまくいったのと少しだけ状況が違い、入力動画のサイズが違ったりエンコーダが違ったりしてたこと。なので「入力をあらかじめ変換しておけばいいかな」などなど色々試行錯誤してしまったし、リンクした StackOverflow の回答に基づいて「そーか、fifo、afifo を使えば解決するのかぁ」と、試行錯誤をはじめてしまった。

「そーか、fifo、afifo を使えば解決するのかぁ」の試行錯誤途中で、気付いちゃった…。「あ、[ac1]なんかいねーよ」。つまり先のはこうじゃないとダメ:

 1 #! /bin/sh
 2 
 3 ffmpeg -y -i "1.mp4" -i "2.mp4" -i "3.mp4" -i "4.mp4" -filter_complex "
 4 color=c=black:s=960x540:d=20.968[prepadv0];
 5 sine=frequency=0:sample_rate=44100:d=20.968 [prepada_l0];
 6 sine=frequency=0:sample_rate=44100:d=20.968 [prepada_r0];
 7 [prepada_l0][prepada_r0]amerge=inputs=2[prepada0];
 8 [0:v]scale=960:540[v0];
 9 color=c=black:s=960x540:d=4.452[postpadv0];
10 sine=frequency=0:sample_rate=44100:d=4.452 [postpada_l0];
11 sine=frequency=0:sample_rate=44100:d=4.452 [postpada_r0];
12 [postpada_l0][postpada_r0]amerge=inputs=2[postpada0];
13 [prepadv0][v0][postpadv0] concat=n=3:v=1:a=0 [vc0];
14 [prepada0][0:a][postpada0] concat=n=3:v=0:a=1 [ac0];
15 
16 [1:v]scale=960:540[v1];
17 
18 color=c=black:s=960x540:d=26.819[prepadv2];
19 sine=frequency=0:sample_rate=44100:d=26.819 [prepada_l2];
20 sine=frequency=0:sample_rate=44100:d=26.819 [prepada_r2];
21 [prepada_l2][prepada_r2]amerge=inputs=2[prepada2];
22 [2:v]scale=960:540[v2];
23 color=c=black:s=960x540:d=11.821[postpadv2];
24 sine=frequency=0:sample_rate=44100:d=11.821 [postpada_l2];
25 sine=frequency=0:sample_rate=44100:d=11.821 [postpada_r2];
26 [postpada_l2][postpada_r2]amerge=inputs=2[postpada2];
27 [prepadv2][v2][postpadv2] concat=n=3:v=1:a=0 [vc2];
28 [prepada2][2:a][postpada2] concat=n=3:v=0:a=1 [ac2];
29 
30 color=c=black:s=960x540:d=29.396[prepadv3];
31 sine=frequency=0:sample_rate=44100:d=29.396 [prepada_l3];
32 sine=frequency=0:sample_rate=44100:d=29.396 [prepada_r3];
33 [prepada_l3][prepada_r3]amerge=inputs=2[prepada3];
34 [3:v]scale=960:540[v3];
35 color=c=black:s=960x540:d=2.594[postpadv3];
36 sine=frequency=0:sample_rate=44100:d=2.594 [postpada_l3];
37 sine=frequency=0:sample_rate=44100:d=2.594 [postpada_r3];
38 [postpada_l3][postpada_r3]amerge=inputs=2[postpada3];
39 [prepadv3][v3][postpadv3] concat=n=3:v=1:a=0 [vc3];
40 [prepada3][3:a][postpada3] concat=n=3:v=0:a=1 [ac3];
41 
42 [vc0][v1]hstack[1v];
43 [vc2][vc3]hstack[2v];
44 [1v][2v]vstack[v];
45 [ac0][1:a][ac2][ac3]
46 amerge=inputs=4,
47 pan=stereo|\
48     c0 < c0 + c4   +   0.2 * c2 + 0.2 * c6 |\
49     c1 < c3 + c7   +   0.2 * c1 + 0.2 * c5
50 [a]
51 " -map '[v]' -map '[a]' -ac 2 \
52   "merged.mp4"

「ffmpeg のエラー報告はイカれてる」てことは前回も書いた。この場合さぁ、「そんなラベル、おらへんがな」ってエラーにならなきゃおかしいでしょうよ、ほかでは出来てるのに、なんで検出しないの、この子は。

そういうわけで「fifo, afifo」は試さずじまいで解決。なんなのよ。