Вопрос или проблема
У меня есть последовательность фильтров:
[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
Пояснения:
-
Упорядочение Сегментов: Убедитесь, что все используемые сегменты обработаны до их комбинирования. Вы можете использовать две конечные переменные, одну для видео и одну для аудио, чтобы объединить все нужные потоки.
-
Конкатенация: После применения всех необходимых эффектов к видео и аудио создайте два выхода: один для видео и другой для аудио. Это позволит избежать возможных проблем с EOF.
-
Ссылка на Скорость Обработки: Постарайтесь скорректировать значение поля
offset
в вашей функции xfade, чтобы избежать конфликтов между различными сегментами. Это поможет свести к минимуму проблемы с временными метками, когда FFmpeg обрабатывает ваши потоки.
Заключение:
После выполнения этих изменений команда FFmpeg должна корректно обработать ваши видео и аудио потоки, сохраняя переходы между сегментами без возникновения ошибок. Попробуйте применить данную конфигурацию и посмотрите, исчезнут ли проблемы с EOF и отсутствие данных в выходном файле.