ffmpeg фильтрграф перекрытие без порядка

Вопрос или проблема

У меня есть последовательность фильтров:

[0:v]trim=start=10:duration=5,setpts=PTS-STARTPTS,fps=30[v2];
[0:a]atrim=start=10:duration=5,asetpts=PTS-STARTPTS[a2];

[0:v]trim=start=20:duration=5,setpts=PTS-STARTPTS,fps=30[v3];
[0:a]atrim=start=20:duration=5,asetpts=PTS-STARTPTS[a3];

[0:v]trim=start=30:duration=5,setpts=PTS-STARTPTS,fps=30[v4];
[0:a]atrim=start=30:duration=5,asetpts=PTS-STARTPTS[a4];

[0:v]trim=start=60:duration=5,setpts=PTS-STARTPTS,fps=30[v1];
[0:a]atrim=start=60:duration=5,asetpts=PTS-STARTPTS[a1];

[v12][v3]xfade=transition=radial:duration=1:offset=8[v23];
[a12][a3]acrossfade=d=1[a23];

[v23][v4]xfade=transition=fade:duration=1:offset=12[vo];
[a23][a4]acrossfade=d=1[ao];

[v1][v2]xfade=transition=wiperight:duration=1:offset=4[v12];
[a1][a2]acrossfade=d=1[a12];

Дело в том, что если я ставлю сегменты в хронологическом порядке, то все работает прекрасно, но если я настраиваю их так, то получаю эту ошибку (я добавил немного отладочного контекста):

...
[out_#0:0 @ 000002345029c280] EOF on sink link out_#0:0:default.
[fc#0 @ 000002344ddf3440] Фильтр вернул EOF, завершение
[fc#0 @ 000002344ddf3440] Все потребители вернули EOF
[out#0/mp4 @ 000002344e4307c0] sq: 0 EOF
[out#0/mp4 @ 000002344e4307c0] sq: завершить 0; head ts 17
[out#0/mp4 @ 000002344e4307c0] sq: завершить очередь
[aost#0:1/aac @ 000002344ddfd480] Поток кодировщика получил EOF
[aost#0:1/aac @ 000002344ddfd480] Не удалось открыть кодировщик до EOF
[aost#0:1/aac @ 000002344ddfd480] Задача завершена с кодом ошибки: -22 (Неверный аргумент)
[aost#0:1/aac @ 000002344ddfd480] Завершение потока с кодом возврата -22 (Неверный аргумент)
[libx264 @ 000002344de00a80] frame= 446 QP=30.47 NAL=0 Slice:B Poc:120 I:80   P:601  SKIP:239  size=3870 bytes
...
[libx264 @ 000002344de00a80] frame= 508 QP=30.38 NAL=2 Slice:P Poc:60  I:33   P:607  SKIP:280  size=3883 bytes
[libx264 @ 000002344de00a80] frame= 509 QP=31.81 NAL=0 Slice:B Poc:58  I:2    P:566  SKIP:352  size=2278 bytes
[vost#0:0/libx264 @ 000002344e42eac0] Завершение потока с кодом возврата 0 (успех)
[out#0/mp4 @ 000002344e4307c0] Ничего не было записано в выходной файл, поскольку по крайней мере один из его потоков не получил пакетов.

Не знаю, как это решить, я пробовал использовать concat, и с ним работает, но я хочу кроссфейд, потому что concat имеет большую продолжительность, чем кроссфейд.

Кстати, команда ffmpeg выглядит так

ffmpeg -y -loglevel debug -i input.mp4 -/filter_complex filters.script -map "[vo]" -map "[ao]"  out.mp4

Ответ или решение

Для решения вашей проблемы с использованием фильтров в FFmpeg с перекрытием (crossfade) на неупорядоченных сегментах, необходимо убедиться, что вы правильно разбиваете на сегменты и соединяете их, чтобы избежать ошибок с окончанием потока (EOF) и неправильной обработкой аудио и видео стримов.

Ваша ошибка связана с тем, что FFmpeg не может найти или правильно соединить необходимые потоки при использовании операции перекрытия. Чтобы исправить это, важно правильно прописать порядок обработки и соединения сегментов.

Вот пример того, как можно переформулировать ваш фильтр, чтобы избежать ошибок:

ffmpeg -y -loglevel debug -i input.mp4 -filter_complex "
[0:v]trim=start=10:duration=5,setpts=PTS-STARTPTS,fps=30[v2];
[0:a]atrim=start=10:duration=5,asetpts=PTS-STARTPTS[a2];

[0:v]trim=start=20:duration=5,setpts=PTS-STARTPTS,fps=30[v3];
[0:a]atrim=start=20:duration=5,asetpts=PTS-STARTPTS[a3];

[0:v]trim=start=30:duration=5,setpts=PTS-STARTPTS,fps=30[v4];
[0:a]atrim=start=30:duration=5,asetpts=PTS-STARTPTS[a4];

[0:v]trim=start=60:duration=5,setpts=PTS-STARTPTS,fps=30[v1];
[0:a]atrim=start=60:duration=5,asetpts=PTS-STARTPTS[a1];

[v2][v3]xfade=transition=radial:duration=1:offset=4[v23];
[a2][a3]acrossfade=d=1[a23];

[v23][v4]xfade=transition=fade:duration=1:offset=8[vo];
[a23][a4]acrossfade=d=1[ao];

[v1][v4]xfade=transition=wiperight:duration=1:offset=12[v1_final];
[a1][a4]acrossfade=d=1[a1_final];

[vo][v1_final]concat=n=2:v=1:a=0[output_video];
[ao][a1_final]concat=n=2:v=0:a=1[output_audio];
" -map "[output_video]" -map "[output_audio]" out.mp4

Пояснения:

  1. Упорядочение Сегментов: Убедитесь, что все используемые сегменты обработаны до их комбинирования. Вы можете использовать две конечные переменные, одну для видео и одну для аудио, чтобы объединить все нужные потоки.

  2. Конкатенация: После применения всех необходимых эффектов к видео и аудио создайте два выхода: один для видео и другой для аудио. Это позволит избежать возможных проблем с EOF.

  3. Ссылка на Скорость Обработки: Постарайтесь скорректировать значение поля offset в вашей функции xfade, чтобы избежать конфликтов между различными сегментами. Это поможет свести к минимуму проблемы с временными метками, когда FFmpeg обрабатывает ваши потоки.

Заключение:

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

Оцените материал
Добавить комментарий

Капча загружается...