Ffmpeg конкатенация удаление части первого видео

Я использую ffmpeg.exe чтобы объединить два видео. Первое видео-это, по сути, пятисекундное введение, визуализированное в 1080p со скоростью 25 кадров в секунду, и оно всегда будет оставаться в том же формате. Второй-случайное видео, которое может быть любой длины и формата, но будет MP4 файл (h264). Этот конкретный тест, случается видео разрешением 400х240 и выше на 30fps.

Итак, из этого у меня есть 5-секундное вступительное видео в 1080p25, объединенное с видео 240p30. С они оба файлы MP4, я сначала перекодировать каждый mpegts файл, используя следующие кнопки:

ffmpeg -y -i intro.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intro.mp4.ts
ffmpeg -y -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.mp4.ts

теперь, когда два файла преобразуются в форматы, которые можно объединить, я запускаю следующую команду для кодирования двух присоединяемых видео:

ffmpeg -y -i "concat:intro.mp4.ts|video.mp4.ts" -c:v libx264 -preset ultrafast -crf 20 -vf fps=60 -b:v 8M -minrate 8M -maxrate 12M -bufsize -8M -c:a aac -b:a 256k output.mp4

это работает почти так, как ожидалось, но одна вещь продолжает происходить: Когда кодирование доходит до 5-секундной отметки (либо конец вступления, либо начало фактического видео), он отображает это предупреждение: DTS 126000 < 619200 out of order

остальная часть преобразования работает нормально. Однако, когда я воспроизвести файл вывода, играет музыка, а потом в самом конце интро переходит к началу следующего видео. Некоторые видеоплееры просто пропускают разрыв. Другие игроки будут играть остальную часть интро без звука в этой конкретной области, заставляя меня поверить, что это аудио проблема.

так как остальная часть файла играет просто отлично, я экспериментировал с настройками и был удивлен, обнаружив, что при изменении предустановки x264 от ultrafast to medium или slow, это сделало проблему хуже: пропуск произойдет раньше во вступлении, но оставит фактическое видео незатронутым. Где ultrafast приведет к пропуску, чтобы опустить последнюю половину секунды видео / аудио,medium вызовет секунду до полутора секунд, и slow вырезали за две секунды.

что является причиной этого и как я могу исправить эту проблему? Я прочитал предложения перекодирования видео до объединения, но я бы хотел избежать этого, если возможно, т. к. интро собирается остаются теми же каждый раз. Если это единственное решение, есть ли способ выполнить все это с помощью одного вызова FFmpeg? Инструмент вызывается программой C#, которую я пишу.

20
задан w0f
18.03.2023 15:11 Количество просмотров материала 2537
Распечатать страницу

1 ответ

вы можете использовать предложения ответ масштабировать видео при необходимости:

ffmpeg -y -i intro.mp4 -i video.mp4 -filter_complex "\
[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v0]; \
[1:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v1]; \
[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[v][a] \
" -map "[v]" -map "[a]" output.mp4

обратите внимание, что я применил это ко всем входам, но вы, конечно, можете выборочно сделать это с теми, которые, как вы знаете, будут отличаться от выходного размера. В случае различных SAR вы можете использовать setsar фильтр после pad, но я не думаю, что это строго необходимо:

[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=sar=1[v0]
1
отвечен slhck 2023-03-19 22:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх