Управляйте видео с помощью ffmpeg без потери качества

Я вращаю видео с помощью ffmpeg со следующим кодом:

ffmpeg -i nd750_a0040.MOV -vf "transpose=dir=clock, transpose=dir=clock" out.mkv

Полученный файл почти в 10 раз меньше исходного. Я нашел этот вопрос, который касается связанный с этим вопрос и предлагает передать ffmpeg кодек и битрейт, полученные из следующего:

bitratev="$(ffmpeg -i "$1" -f null - |& grep video: | awk -F'[:|kB]' '{print $2}')"
codecv="$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nk=1:nw=1 "$1")"

однако обе эти команды дают одинаковый результат для обоих файлов: 2643 и h264 соответственно. Правильно ли я предполагаю, что ffmpeg сохраняет эти значения одинаковыми для вывода - по умолчанию?

Однако, если я просматриваю файлы с ffmpeg -i, я получаю разные значения битрейта:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'nd750_a0040.MOV':
  Metadata:
    major_brand     : qt  
    minor_version   : 537331968
    compatible_brands: qt  niko
    creation_time   : 2016-06-18 04:28:03
  Duration: 00:15:40.74, start: 0.000000, bitrate: 11569 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt709/bt470m), 1920x1080, 10029 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2016-06-18 04:28:03
    Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2016-06-18 04:28:03

а также

Input #0, matroska,webm, from 'out.mkv':
  Metadata:
    COMPATIBLE_BRANDS: qt  niko
    MAJOR_BRAND     : qt  
    MINOR_VERSION   : 537331968
    ENCODER         : Lavf56.40.101
  Duration: 00:15:40.74, start: 0.000000, bitrate: 1445 kb/s
    Stream #0:0(eng): Video: h264 (High), yuvj420p(pc), 1920x1080, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)
    Metadata:
      CREATION_TIME   : 2016-06-18 04:28:03
      LANGUAGE        : eng
      ENCODER         : Lavc56.60.100 libx264
      DURATION        : 00:15:40.742000000
    Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      CREATION_TIME   : 2016-06-18 04:28:03
      LANGUAGE        : eng
      ENCODER         : Lavc56.60.100 libvorbis
      DURATION        : 00:15:40.743000000

Итак, у меня есть несколько вопросов:

  • Какой битрейт является правильным для каждого видео?
  • Вся ли потеря информации между этими двумя файлами покрывается битрейтом (или ffmpeg по умолчанию изменяет другие вещи, которые также приводят к меньшему размеру файла - если да, то что?)?
  • Как сделать так, чтобы ничего не менялось, кроме формата контейнера и поворота?

person TheChymera    schedule 17.08.2016    source источник


Ответы (1)


Если вы манипулируете видео с помощью фильтра, например фильтра транспонирования, видео будет перекодировано.

Команда ниже даст вам битрейт видеопотока, если он доступен.

ffprobe video.mov -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1

См. мой ответ здесь, если это не дает значения.


Ваша текущая команда также перекодирует звук. Вы можете пропустить это и указать битрейт:

ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -b:v 10M -c:a copy out.mkv

Кодирование x264 является умным, поэтому оно будет использовать столько битрейта, сколько необходимо.

Вместо того, чтобы придерживаться битрейта, вы можете использовать метод CRF, который направлен на поддержание постоянного качества во всем. 18 — хорошее число. Чем ниже, тем лучше, но визуально это обычно не заметно.

ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -crf 18 -c:a copy out.mkv

Конечно, если ваш плеер поддерживает это, вы можете просто добавить тег ротации и вообще не перекодировать.

ffmpeg -i nd750_a0040.MOV -c copy -metadata:s:v:0 rotate=180 out.mkv
person Gyan    schedule 17.08.2016