Если вам нужно высочайшее качество и минимальный размер файла, вы должны использовать кодек с эффективным сжатием. Однако сначала нужно подумать о том, хотите ли вы (математически) выполнить кодирование без потерь, визуально без потерь или с потерями:
Кодирование без потерь , конечно, приведет к увеличению размера файла, но дает преимущество сохранения исходных данных. Затем вы можете извлечь отдельные кадры из видео без потери качества. Здесь можно использовать такие кодеки, как HuffYUV или FFV1 . Они часто используются в архивных целях, где необходимо сохранить оригинальный материал и избежать потери поколения . libx264
(H.264), libx265
(HEVC) и libvpx-vp9
также могут использоваться в режиме без потерь:
ffmpeg -i <input> -c:v huffyuv output.avi
ffmpeg -i <input> -c:v ffv1 output.avi
ffmpeg -i <input> -c:v libx264 -crf 0 output.mp4
ffmpeg -i <input> -c:v libx265 -crf 0 output.mp4
ffmpeg -i <input> -c:v libvpx-vp9 -lossless 1 output.webm
Визуально кодирование без потерь отбрасывает некоторые данные, но сохраняет качество таким образом, что люди, скорее всего, не заметят никакой разницы между исходным и закодированным видео. Для этой цели часто используются так называемые "промежуточные" кодеки, такие как ProRes (см. Здесь). Вы также можете сделать визуально кодирование без потерь с помощью libx265
или libx264
, указав достаточно низкое значение CRF (объяснение CRF здесь), например, между 10 и 18 для x264.
ffmpeg -i <input> -c:v prores -profile:v 3 output.mov
ffmpeg -i <input> -c:v libx264 -crf 10 -preset ultraslow output.mp4
...
Потерянные кодеки, их много. Если вы можете пожертвовать качеством, вы можете резко уменьшить размер файла. VP9 и HEVC более эффективны, чем H.264, с точки зрения того, сколько места им требуется, но для их кодирования может потребоваться больше времени. Забудьте про Theora и VP8. С VP9, HEVC и H.264 (по крайней мере, с кодировщиками, доступными в ffmpeg) вы можете установить параметр CRF, который даст вам желаемое качество. Вам необходимо визуально проверить свою продукцию, чтобы убедиться, что сумма потерь не слишком велика для вашей цели. Для libx264
значения CRF между 18 и 23 выглядят "хорошо".
ffmpeg -i <input> -c:v libx264 -crf 23 -preset ultraslow output.mp4
ffmpeg -i <input> -c:v libvpx-vp9 -crf 10 -b:v 0 output.webm
...
Как правило, если вы стремитесь к архивированию контента, вы не должны просто указывать целевой битрейт. Вместо этого вы хотите использовать режим постоянного качества, при котором кодировщик может использовать столько битов, сколько необходимо для сохранения качества изображения (в определенных пределах). Особенно с кодировщиками H.264 или HEVC libx264
и libx265
, использование -b:v
для однопроходного кодирования не рекомендуется, так как это может привести к огромным изменениям качества с течением времени. (Я написал статью о различных режимах контроля скорости здесь.) Подводя итог, если вы архивируете, просто выберите постоянное значение CRF.
Также очень важно, чтобы вы не меняли размер видео, так как оно либо приводит к размытию (при масштабировании), либо выбрасывает данные (при уменьшении масштаба). Просто пропустите опцию -s:v
если ваши изображения не слишком велики для видео.
Наконец, при выполнении визуального кодирования без потерь или с потерями, вы можете выбирать между скоростью сжатия и эффективностью сжатия. Другими словами, если вы будете ждать дольше, вы можете уменьшить размер файла. Здесь вступают в действие preset
параметры: если вы выберете предустановку, такую как ultraslow
, процесс кодирования займет много времени, но результирующий файл - при условии заданного CRF - будет меньше, даже если он имеет такое же качество. VP9 имеет различные варианты управления скоростью, см. Здесь.
Еще одна вещь: с libx264
, вы можете использовать -tune stillimage
чтобы оптимизировать кодирование для изображений. Кроме того, выбор минимально необходимой частоты кадров поможет, конечно, сохранить размер файла.
Некоторая документация: