Я разделил файл .mkv
с аудио и видео на два файла с помощью следующей команды:
ffmpeg -i input.mkv -vn -codec copy out.wav #extract audio
ffmpeg -i input.mkv -an -codec copy out.mkv #extract video
И я просто объединил их в один .mkv
файл:
ffmpeg -i out.mkv -i out.wav -codec copy final.mkv #this behaves quite strangely
Я думал, что начальный вход input.mkv
и конечный вывод final.mkv
должны быть точно такими же, но в final.mkv
видео и аудио были смещены примерно на пять секунд. Используя ffprobe
, я обнаружил, что причина была в том, что видео часть (out.mkv
) была обрезана по длине (т.е. пять секунд) без причины.
Что здесь происходит? Как мне избежать этого странного сдвига?
Подробное объяснение:
В дальнейшем я буду использовать этот пример ввода , называемый input.mkv
. Сначала извлеките из него видео и аудио.
$ ffmpeg -i input.mkv -vn -codec copy out.wav
$ ffmpeg -i input.mkv -an -codec copy out.mkv
Затем проверьте продолжительность их.
$ ffprobe -i out.wav 2>&1 | grep Duration
Duration: 00:00:18.88, bitrate: 1536 kb/s
$ ffprobe -i out.mkv 2>&1 | grep Duration
Duration: 00:00:18.87, start: 0.000000, bitrate: 1877 kb/s
Затем объедините их.
$ ffmpeg -i out.mkv -i out.wav -codec copy final.mkv
Наконец, проверьте длительность потоков.
$ ffprobe -i final.mkv
Input #0, matroska,webm, from 'final.mkv':
Metadata:
ENCODER : Lavf58.29.100
Duration: 00:00:18.88, start: 0.000000, bitrate: 3414 kb/s
Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 900x586 [SAR 1:1 DAR 450:293], 30.30 fps, 30.30 tbr, 1k tbn, 60 tbc (default)
Metadata:
DURATION : 00:00:18.866000000
Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Metadata:
DURATION : 00:00:18.880000000
Странно, длительность видеопотока была обрезана с 18.8700
до 18.8660
, хотя длина аудиопотока не изменяется вообще.
Кажется, чем длиннее видео, тем большую часть обрезают. (В моем случае одночасового видео обрезалось не менее пяти секунд.)
Информация о версии:
~ $ ffmpeg -version
ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.2.1 (Arch Linux 9.2.1+20200130-2) 20200130
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100