2

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

Я все еще пытаюсь разрезать видео по кадрам. В то время как получающиеся метки времени кажутся правильными на видео, звук далеко не синхронизирован. Это даже не помогает добавлять постоянное время в asetpts . Кажется, он меняется с каждым другим диапазоном кадров, который я использую.

Вот что у меня есть (это просто соответствующие части более длинного скрипта):

SET SELECT=select='gte(n\,%4)*lte(n\,%5)'
SET ASELECT=aselect='gte(n\,%4)*lte(n\,%5)'
SET SETPTS=setpts='PTS-STARTPTS'
SET ASETPTS=asetpts='PTS-STARTPTS'
SET SCALE=scale='1280:-1'
SET CROP=%3
:
ffmpeg -y -i %1 -af %ASELECT%,%ASETPTS% -vf %SELECT%,%SETPTS%,%SCALE%,%CROP% ^
-ab 128k -crf 18 -pix_fmt yuv420p "%1 converted.mp4"

Короче

  • он принимает кадрированный материал и начальный / конечный кадры в качестве параметров
  • исходный файл начинается с ~ 1 секунды аудио до начала синхронизированного видео
  • если я не использую setpts/asetpts и не select/aselect , результирующее видео начинается с одной секунды замороженного кадра со звуком, а затем видео воспроизводится синхронно с аудио
  • если я не использую setpts/asetpts , результирующее видео начинается со стоп- кадра, затем идет звук, а затем начинается пропущенный стартовый кадр, в котором видео воспроизводится синхронно с аудио
  • если я не использую select/aselect , полученное видео будет отключено примерно на одну секунду как для видео, так и для аудио
  • если я использую все, полученное видео будет иметь как видео, так и аудио, начиная с начального кадра, и звук будет отключен примерно на одну секунду

Я думаю, что select/aselect работает нормально, но setpts/asetpts вызывает проблемы. Работа только с видеофильтрами или аудиофильтрами только ухудшает ситуацию.

Очевидно, я делаю что-то не так здесь. Поэтому, может кто-нибудь помочь мне здесь? Может быть, можно даже объяснить, как setpts и asetpts работают вместе?

РЕДАКТИРОВАТЬ:
Другие попытки:

ffmpeg -y -i %1 ^
-filter_complex %ASELECT%,%ASETPTS%;%SELECT%,%SETPTS%,%SCALE%,%CROP% ^
-ab 128k -crf 18 -pix_fmt yuv420p "%1 converted.mp4"

с двумя входами (это очень медленно):

ffmpeg -y -i %1 -i %1 ^
-filter_complex [1:1]%ASELECT%,%ASETPTS%[aud];[0:0]%SELECT%,%SETPTS%,%SCALE%,%CROP%[vid] ^
-map [vid] -map [aud] ^
-ab 128k -crf 18 -pix_fmt yuv420p "%1 converted.mp4"

1 ответ1

2

Короче говоря, мне не удалось.

То, что я делаю сейчас, это преобразование номера начала и конца кадра в метку времени и использование -ss и -t как и всех остальных в мире (* sigh *). Я могу сделать это, так как я знаю FPS клипа.

Что касается синхронизации, я использую трюк «один клип в двух входных файлах».

Последняя команда теперь выглядит так:

ffmpeg -y -i %1 -itsoffset %audioDelay% -i %1 -vf %SCALE%,%CROP% ^
-ss %startTime% -t %duration% -r 25 ^
map=-map 0:0 -map 1:1 ^
-ab 128k -crf 18 -pix_fmt yuv420p "%~1 converted.mp4"

Нет больше фильтров ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .