Я записал 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 разницу в видео и аудио)?
Попробовав несколько случайных вещей, мне удалось синхронизировать аудио/видео, изменив скорость звука:
ffmpeg -i witness.mov -af asetrate=48018 resampled.mkv
Синхронизация resampled.mkv
правильная, но, к сожалению, звук на несколько секунд короче остального видео. Это означает, что проблема действительно в том, что частота кадров во входном файле немного ниже, чем должна быть. По моим расчетам, проблема в том, что частота кадров установлена на 59,96, а если установить ее ровно на 60,0, то видео будет соответствовать звуку. Я пытался использовать:
ffmpeg -i witness.mov -framerate 60 resampled.mkv
Но частота кадров видео не изменилась.
Гьян
-af aresample=async=1
и проверьте.Гжегож Адам Ханкевич