Я использую 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#, которую я пишу.