Оптимизируйте размер видеофайлов без потери качества

Есть ли простой способ (в командной строке - я хочу написать скрипт, который сжимает все видео в папке), чтобы уменьшить размер файла видео (почти) без потери качества? Есть ли метод, который одинаково хорошо работает для разных видеоформатов (mp4, flv, m4v, mpg, mov, avi)?

Я должен отметить, что большинство видео, которые я хотел бы сжать, загружаются через веб-видео (mp4, flv), поэтому неясно, есть ли много места для дальнейшего сжатия.

5
задан 8 March 2011 в 18:55

2 ответа

В мистической стране PNG наиболее эффективный способ сжатия вблизи без потерь - это сжатие изображения практически при любой возможной комбинации настроек и сравнение выходных данных. Это то, что делают такие приложения, как pngcrush.

1111 Нет причины, по которой подобный процесс не сработал бы на бумаге. На практике существует несколько проблем:

  • Однократное сжатие видео уже намного более длительный процесс, чем кодирование изображения PNG.
  • Конфигурационных комбинаций примерно в 1000 раз больше.
  • Эти два заговора, чтобы сделать процесс экспоненциально длиннее на несколько степеней.
  • Он также использовал бы неоправданное количество дискового пространства, памяти и процессорного времени.
  • Кадры смешиваются, если есть изменение частоты кадров и, очевидно, изменяются, если вы меняете размер кадра или кадрирование, что делает процесс сравнения еще сложнее

В довершение всего, вы имеете дело с контентом, который уже отравлен артефактами и кодирующим осадком. Мой простой ответ на вопрос «Есть ли простой путь» должен быть №

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

find -iname '*.flv' -exec \
    mencoder {} -o {}.recomp.avi -ovc x264 -x264encopts threads=9:bitrate=400 -oac mp3lame -lameopts abr:br=52 \;

Но будет потеря. Вы просто должны судить, насколько это приемлемо.

0
ответ дан 8 March 2011 в 18:55

Вы также можете сделать это с помощью avconv, основываясь на
avconv -i <sourcefile> -c:v libx264 -crf 23 output.mp4, вы можете повысить качество, уменьшив коэффициент crf (23 в примере), и уменьшить, увеличив его.

Вы можете установить значения от 0 до 51, где более низкие значения приведут к лучшему качеству (за счет более высоких размеров файлов). Значения вменяемых значений находятся в диапазоне от 18 до 28. По умолчанию для x264 установлено значение 23, поэтому вы можете использовать это в качестве отправной точки.

Сценарий, который должен позволить вам перейти на другой формат без потери качества (но с небольшим уменьшением или без уменьшения размера), будет

#!/bin/bash
echo "This script will attempt to copy the video and audio streams of all non-mkv files in the current directory to a mkv video container of the same name as the sources without overwriting."
read -p "Press any key to continue or CTRL-C to cancel"

for f in *.* 
    do
    name=$(echo "$f" | sed 's/\.[^\.]*$//')
    ext=$(echo "$f" | sed 's/^.*\.//')
    echo "$f is made up of the base $name and ends with $ext"
    target="$name.mkv"
    echo target = $target
        if  [ "$f" = "$target" ];
        then
            echo "$f=$target skipping overwrite"
        else 
            avconv -i "$f" -c:a copy -c:v copy "$name.mkv"
        fi
    done

. Обратите внимание, что аудио и видео кодеки, используемые в этом сценария copy, поэтому повторное кодирование не должно выполняться. Любая экономия по размеру будет минимальной и будет результатом только более эффективного контейнера, чем использовалось ранее. Чтобы получить уменьшение в размере, требуется повторное кодирование и вам нужно настроить скрипт, заменив c:v copy на -c:v libx264 -crf 23 (корректируя значение -crf в соответствии с вашими потребностями, как упомянуто выше). Не стесняйтесь комментировать или удалять любые лишние линии эха.

Примечание : Форматы, которые вы упоминаете «mp4, flv, m4v, mpg, mov, avi», являются контейнерами и практически не имеют отношения к кодекам, используемым для кодирования потоков внутри них. Обсуждение перекодирования для уменьшения размера потребует знания кодеки, содержащиеся в контейнерах и должны оцениваться в каждом конкретном случае.

Источники: тестирование и http://slhck.info/articles/crf

0
ответ дан 8 March 2011 в 18:55

Другие вопросы по тегам:

Похожие вопросы: