Как уменьшить частоту 4k до 1080p с помощью ffmpeg при сохранении качества?

21

У меня есть несколько кадров 4K 3840x2160 в формате MP4, которые мне нужно уменьшить до 1080p. Я пробовал бегать

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

но в результате получается очень плохое качество: все изображение состоит из квадратных «плиток», как если бы я увеличивал изображение 4: 1.

Вот результат выполнения этой команды:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

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

Как я могу это сделать?

Лара Майклс
источник
Пожалуйста, покажите полный, полный вывод консоли из вашей команды. Вы можете просто закодировать короткий сегмент, поэтому добавьте, -t 10чтобы сделать 10-секундный выход. Почему вы хотите уменьшить масштаб? Какой вариант использования для вашего масштабированного вывода? Эта информация поможет мне дать более точный ответ.
Llogan
@LordNeckbeard Я только что добавил вывод консоли. Я хочу уменьшить масштаб, чтобы мне было легче делиться этими клипами с людьми, которые работают со мной.
Лара Майклз
1
Не забывайте -c:a copy, поскольку вы не хотите или не нуждаетесь в перекодировании аудиопотока. Используйте -map 0для копирования любых метаданных главы или другого материала. (ffmpeg по умолчанию принимает только 1 видео + 1 аудит.)
Питер Кордес
1
Кроме того, -sws_flags lanczos+print_infoбудет использоваться лучший алгоритм масштабирования, чем по умолчанию (я думаю, билинейный). Ответ stlb охватывает часть процесса кодирования видео.
Питер Кордес
2
@PeterCordes В качестве альтернативы scale=1920:-2:flags=lanczos. Я также собирался упомянуть -2для масштаба в моем несуществующем ответе. Для тех, кто не знает, вы можете указать -2ширину или высоту, и она автоматически предоставит правильное значение, сохранив соотношение сторон и сделав значение, кратное 2 (требуется для libx264 для выходных данных yuv420p).
Llogan

Ответы:

17

Настройки по умолчанию для ffmpeg очень низкого качества, и, поскольку вы не указываете кодек или параметры качества, он просто использует значения по умолчанию (я не знаю, почему разработчики не исправляют это, потому что это вызывает много вопросов на форумах). где угодно).

Изменить : значения по умолчанию теперь довольно вменяемые. В последней сборке ffmpeg вам не нужно указывать ничего, кроме входных и выходных файлов, для достижения хороших результатов. Вы можете, конечно, настроить желание вашего сердца.

Попробуйте добавить -c:v libx264 -crf 20 -preset slowв команду.

  • -c:v libx264 говорит ему использовать кодировщик libx264,
  • crf 20 использует квантователь коэффициента постоянной скорости (который парадоксально означает переменную скорость передачи данных, но постоянное качество) со значением 20 (довольно хорошее качество; чем ниже, тем лучше качество / большие файлы, чем выше, тем хрупче / меньше),
  • slowзапрограммированный ярлык для связки параметров датчика , что средства он помещает немного больше усилий, чем по умолчанию (среда).

Вы можете настроить эти параметры, см. Руководство по кодированию h.264 для получения инструкций о том, какие ручки поворачивать.

И если вы используете аудио как есть, добавьте c:a copy. Это сделает прямую копию аудиопотока без перекодирования.

STIB
источник
Значения по умолчанию зависят от кодера. libx264 обычно используется для вывода MP4 по умолчанию, и он производит вывод хорошего качества без дополнительных опций, но сборка ffmpeg в вопросе, кажется, не поддерживает этот кодер и поэтому использует древний кодер, mpeg4производящий видео MPEG-4 Part 2, и значения по умолчанию для него были более вменяемыми в период его расцвета (например, для 320x240 и т. д.).
Llogan
Приятно слышать, что libx264 теперь используется по умолчанию.
15:00
Я бы сказал, что CRF 20 чертовски хорош. 18 функционально без потерь. Я делаю большинство своих видео в 23.
user24601
Большая часть моей работы отображается на устройствах воспроизведения, работающих локально с SD-карты. Мне не нужно много оптимизировать по размеру, поэтому я оставляю качество как можно выше. Я согласен, я бы набрал это, если бы я доставлял через Интернет.
STIB
Это не помогло мне. У меня все еще есть странные странности, где бы ни происходило движение в видео. CRF 18, по умолчанию для замедления. 2.7k-> 1080p.
Rewolf
0

Используйте avconv, если хотите:

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
Гурай Челик
источник