Транскодирование длинного видео с помощью ffmpeg приводит к рассинхронизации звука

Я записал 50-минутное видео, отредактировал его в Hitfilm Express для цензуры/размытия людей и экспортировал его в формате высокого разрешения Hitfilm, создав файл размером 80 ГБ. Когда я пытаюсь перекодировать этот файл во что-то более управляемое, ffmpeg заставляет звук дрейфовать. В начале все звучит нормально, но постепенно звук идет быстрее , чем видео. Входной файл, как сообщает ffmpeg:

Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Volumes/BakaTres/witness.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 537199360
    compatible_brands: qt  
  Duration: 00:50:31.42, start: 0.000000, bitrate: 230875 kb/s
    Stream #0:0(eng): Video: cfhd (CFHD / 0x44484643), yuv422p10le, 1920x1080, 229401 kb/s, 59.96 fps, 59.96 tbr, 90k tbn, 90k tbc (default)
    Metadata:
      encoder         : CineForm HD
    Stream #0:1(eng): Audio: pcm_s16le (lpcm / 0x6D63706C), 48000 Hz, stereo, s16, 1536 kb/s (default)

После запуска следующей команды перекодирования ffmpeg -i witness.mov -filter:v scale=640:-1 mini.mkv, которая перекодирует все, это статистика выходного файла:

Input #0, matroska,webm, from 'mini.mkv':
  Metadata:
    COMPATIBLE_BRANDS: qt  
    MAJOR_BRAND     : qt  
    MINOR_VERSION   : 537199360
    ENCODER         : Lavf57.56.100
  Duration: 00:50:30.42, start: 0.000000, bitrate: 785 kb/s
    Stream #0:0(eng): Video: h264 (High 4:2:2), yuv422p(progressive), 640x360, 59.96 fps, 59.96 tbr, 1k tbn, 119.92 tbc (default)
    Metadata:
      ENCODER         : Lavc57.64.101 libx264
      DURATION        : 00:50:30.422000000
    Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      ENCODER         : Lavc57.64.101 libvorbis
      DURATION        : 00:50:28.403000000

Первым признаком того, что что-то идет не так, является то, что в исходном файле указана продолжительность 50:31,42, а транскод генерирует файл 50:30,42. Я бы не возражал против второго меньше, если бы это было не так, потому что производимый звук составляет 50: 28,4, на две секунды меньше, чем видео, что объясняет разницу в задержке. К сожалению, ffmpeg не показывает входную длину, но если я скопирую исходный звук в файл aiff, Audacity скажет мне, что его длина действительно 50: 28,4, поэтому Hitfilm неправильно экспортирует звук с более короткой длиной, чем видео?

Я видел следующий ответ для аналогичной проблемы , но я не понимаю, как рассчитываются значения или как применять эти значения к моим входным файлам. Какие значения я должен искать в информации ввода/вывода для сравнения?

Даже если окончательная длина перекодированного файла немного отличается, как я могу предотвратить рассинхронизацию звука (или исправить экспортируемую Hitfilm разницу в видео и аудио)?

Добавьте -af aresample=async=1и проверьте.
@Gyan нет никакой разницы по сравнению с тем, чтобы не использовать этот переключатель.

Ответы (1)

Попробовав несколько случайных вещей, мне удалось синхронизировать аудио/видео, изменив скорость звука:

ffmpeg  -i witness.mov -af asetrate=48018 resampled.mkv

Синхронизация resampled.mkvправильная, но, к сожалению, звук на несколько секунд короче остального видео. Это означает, что проблема действительно в том, что частота кадров во входном файле немного ниже, чем должна быть. По моим расчетам, проблема в том, что частота кадров установлена ​​на 59,96, а если установить ее ровно на 60,0, то видео будет соответствовать звуку. Я пытался использовать:

ffmpeg  -i witness.mov -framerate 60 resampled.mkv

Но частота кадров видео не изменилась.

У меня продолжительность webm -> mp4 1 час, оба метода не работают.