2

Этот вопрос можно рассматривать как продолжение этого вопроса. Я использую ffmpeg 2.0.1.

Следующие команды полезны, когда вы хотите извлечь части одного большого видеофайла с учетом времени создателей.

ffmpeg -i 00402.MTS -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi

Моя проблема в том, что в выходном файле начальное значение равно 0, а смещение звука и видео составляет ~ 50 мс. Какой аргумент я должен использовать, чтобы учесть это «начальное значение» при извлечении нескольких частей большого видеофайла («.mts»)? Что означает это «начальное значение»?

Вывод ffprobe из большого видеофайла МТС

ffprobe m001.MTS 
ffprobe version 2.0.1 Copyright (c) 2007-2013 the FFmpeg developers built on Sep 24 2013 05:31:18 with gcc 4.8 (Debian 4.8.1-10)
configuration: --extra-cflags=-I../static/include --extra-ldflags='-L../static/lib -static' --enable-gpl --enable-version3 --enable-static --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --disable-ffserver
libavutil      52. 38.100 / 52. 38.100
libavcodec     55. 18.102 / 55. 18.102
libavformat    55. 12.100 / 55. 12.100
libavdevice    55.  3.100 / 55.  3.100
libavfilter     3. 79.101 /  3. 79.101
libswscale      2.  3.100 /  2.  3.100
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  3.100 / 52.  3.100
Input #0, mpegts, from 'm001.MTS':
Duration: 00:01:18.25, start: 0.455556, bitrate: 12217 kb/s
Program 1 
Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1440x1080 [SAR 4:3       DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s

Вывод ffprobe из образца экстракта

Input #0, avi, from 'm001.avi':
Metadata:
encoder         : Lavf55.12.100
Duration: 00:00:06.64, start: 0.000000, bitrate: 4950 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (xvid / 0x64697678), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, mono, fltp, 256 kb/s

1 ответ1

1

Я сталкивался с этой проблемой раньше, и единственное решение - использовать его смещение и карту.

ffmpeg -i 00402.MTS -itsoffset 0.455556 -i 00402.MTS -map 1:0 -map 0:1 -s 1280x720 -ss 0:00:05.38608 -vcodec libxvid -qscale:v 2 -acodec ac3 -ar 48000 -ab 256k -t 0:00:06.61391 m001.avi

На этой странице есть хорошее объяснение, почему и как это работает.

http://www.kkoncepts.net/blog/fixing-out-sync-audio-and-video-ffmpeg
(Больше не доступно по оригинальной ссылке; теперь с web-beta.archive.org)

РЕДАКТИРОВАТЬ Здесь есть два основных инструмента, о которых нужно знать:1) itsoffset 2) map

itsoffset существует для смещения потока, который не синхронизирован, тогда как map информирует ffmpeg об использовании определенных потоков с определенных входов и применении их к выходу.

В этом примере мы используем один и тот же вход дважды, отображая потоки таким образом: Мы используем видеопоток первого входа (который, кажется, начинается в 00: 00: 00.00). Мы используем второй вход в качестве аудиопотока, но смещаем время ввода 0,455556 секунд.

С вышеупомянутого сайта:

Здесь «-map 1:0» указывает ffmpeg использовать второй входной файл (1) и взять его первый поток (0) в качестве источника видео. Поскольку это вход, следующий за переключателем «-itsoffset», это поток, который будет задержан. Затем «-map 0.1» говорит ему использовать второй поток с первого входа в качестве аудио. Поскольку к первому входному файлу не применяется смещение, он будет обработан в обычном режиме.

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