2

Я пытаюсь использовать ffmpeg, чтобы разделить быстрое время на меньшее. У меня есть CSV-файл с точками входа и выхода, которые я передаю Python, который, в свою очередь, создает команду ffmpeg. Однако я заметил, что видео не показывается для некоторых сгенерированных файлов, поэтому я сам запустил команду из командной строки.

>ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v copy -c:a copy test.mov
ffmpeg version N-66673-gf0d1b3a Copyright (c) 2000-2014 the FFmpeg developers
  built on Oct  6 2014 22:10:42 with gcc 4.9.1 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
 --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      54.  9.100 / 54.  9.100
  libavcodec     56.  3.101 / 56.  3.101
  libavformat    56.  7.104 / 56.  7.104
  libavdevice    56.  1.100 / 56.  1.100
  libavfilter     5.  1.102 /  5.  1.102
  libswscale      3.  1.100 /  3.  1.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  1.100 / 53.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf56.7.104
  Duration: 00:20:54.46, start: 0.000000, bitrate: 1734 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 1617 kb/s, 24 fps, 24 tbr, 12288 tbn, 24576 tbc (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 113 kb/s (default)
    Metadata:
      handler_name    : DataHandler
File 'test.mov' already exists. Overwrite ? [y/N] y
Output #0, mov, to 'test.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf56.7.104
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 1617 kb/s, 24 fps, 12288 tbn, 12288 tbc (default)
    Metadata:
      handler_name    : DataHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 113 kb/s (default)
    Metadata:
      handler_name    : DataHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 Lsize=      31kB time=00:00:02.18 bitrate= 115.3kbits/s
video:0kB audio:30kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.003038%

QuickTime возникла из Adobe Premiere, и мне пришлось убрать кучу метаданных из файла фильма, чтобы скрипт работал быстрее. Оставление метаданных не имеет значения. У меня есть другой (связанный?) проблема, при которой звук выводится правильно, но видео отсутствует в течение первых нескольких секунд.

Любая помощь приветствуется.

1 ответ1

2

Вы не можете выполнять разделение видео / аудио потока с точностью до кадра (с точностью до миллисекунды) при копировании битовых потоков (-c:v copy -c:a copy). Поскольку выходное видео должно начинаться с ключевого кадра - и оно не будет воспроизводиться должным образом, если не будет - ffmpeg будет искать, пока не найдет ключевой кадр в битовом потоке видео, а затем начнет выводить видео.

В вашем конкретном случае вы можете видеть, что ни один кадр не был написан (frame=0), потому что, очевидно, нет ключевого кадра между начальной и конечной точками в исходном видео. (Очевидно, что некоторые аудио были записаны, но аудио потоки битов в основном могут быть доступны в любой момент времени.)

Единственный выбор, если вам нужна точная обрезка, - перекодировать видео, создавая новые ключевые кадры.

ffmpeg -i in.mov -ss 27.042 -to 29.208 -c:v libx264 -c:a aac -strict experimental test.mov

Вы должны возиться с настройками качества здесь. См. Руководства x264 и AAC . Также прочитайте Seeking с FFmpeg, чтобы узнать, что подразумевает позиция -ss . По сути, для точного вырезания при перекодировании -ss всегда нужно идти после -i .


Если вас не интересует точное время резки, segment мультиплексор может помочь. Здесь вам не обязательно перекодировать. Но обратите внимание:

… Если вам нужно точное разделение для видеофайла, вам нужно, чтобы ключевые кадры ввода соответствовали точному времени разделения, ожидаемому сегментатором, или мультиплексор сегмента начнет новый сегмент с ключевым кадром, найденным следующим после указанного времени начала ,

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