ffmpeg: concat приводит к «переполнению очереди буфера» и короткому звуку

У меня есть этот видеофайл, который в какой-то момент вводит асинхронность ~ 1 секунду. Поэтому я попытался заставить его работать, продублировав короткий сегмент в этом месте, так как там тихо:

$ ffmpeg -i DFW.mp4.mkv -filter_complex '
[0:a] aselect=n=3:e=lt(t\,18*60+42.100)+gt(t\,18*60+41)*2 [as] [ae] [am];
[am] asplit [am1] [am2];
[as]  asetpts=PTS-STARTPTS [as];
[am1] asetpts=PTS-STARTPTS [am1];
[am2] asetpts=PTS-STARTPTS [am2];
[ae]  asetpts=PTS-STARTPTS [ae];
[as] [am1] [am2] [ae] concat=n=4:a=1:v=0 [a]' -map 0:v -map '[a]' -c:v copy DFW-1.mp4

Другими словами, у меня есть

  • asначало до 18:41.000
  • aeконец с 18:42.100
  • amсредний участок между 18:41.000 и 18:42.100, который следует повторить один раз

Сегментация работает, конкатенированная звуковая часть звучит хорошо. Однако aeоказывается, что это всего ~ 5 секунд, и он ffmpegначинает печатать спамные строки «Переполнение очереди буфера, отбрасывание». Все видео длится 1 час 30 минут, оставляя меня с большим количеством тишины до конца.

Другими словами, видео и звук в порядке примерно до 18:48.000, а оставшиеся 1 час 11 минут видео не имеют звука.

Почему это происходит ffmpegи как я могу это исправить?

Я также пытался вместо этого включить аудиосегмент тишины в качестве плана Б, но потерпел неудачу.

Переполнение буфера происходит, когда фильтр, имеющий несколько входов, ожидает один или несколько входов, которые запаздывают. Входы, уже поставленные в очередь, имеют пороговое значение пропуска кадров, которое пересекается, если эти входы достаточно опаздывают. Что плохого в простом добавлении пустого сегмента?
@Mulvya Ну, мне не удалось его создать/использовать. Хотя это решило бы мою проблему. -- Но опять же, я не знаю, почему ffmpeg останавливается через пять секунд. Я бы сказал, либо использовать весь остальной поток, либо вообще ничего. Тем не менее, aeэто ~ 5 секунд, что странно.

Ответы (1)

Предполагая, что в аудио нет разрывов временных меток, должен работать простой атрим и нулевой сегмент.

ffmpeg -i DFW.mp4.mkv -filter_complex '
[0:a]asplit[a][b];
[a]atrim=0:1122.1[pre];
[b]atrim=1122.1,asetpts=PTS-STARTPTS[post];
anullsrc,atrim=0:1.1[seg];
[pre][seg][post]concat=n=3:a=1:v=0[a]' -map 0:v -map '[a]' -c:v copy DFW-1.mp4
А, так вот как это делается. Прохладный.
После вставки пяти таких пауз ffmpeg снова начинает жаловаться на «Переполнение очереди буфера, отбрасывание»
Какая у тебя новая команда?
Я использую точно так же, как и вы. Я просто меняю позиции в atrims.
Как в нескольких командах? Или дополнительные фильтры в одной команде?
Что ж, я принял ваш вызов и выполнил его несколько раз с разными значениями atrims.
Все еще не ясно. Несколько или одна команда?
Опять же, именно то, что вы написали в своем ответе. В любом случае, нам сказали, что мы получим полный аудиопоток из другого источника и, надеюсь, сможем применить его ко всему видео.