Есть ли простой способ (в командной строке - я хочу написать скрипт, который сжимает все видео в папке), чтобы уменьшить размер файла видео (почти) без потери качества? Есть ли метод, который одинаково хорошо работает для разных видеоформатов (mp4, flv, m4v, mpg, mov, avi)?
Я должен отметить, что большинство видео, которые я хотел бы сжать, загружаются через веб-видео (mp4, flv), поэтому неясно, есть ли много места для дальнейшего сжатия.
В мистической стране PNG наиболее эффективный способ сжатия вблизи без потерь - это сжатие изображения практически при любой возможной комбинации настроек и сравнение выходных данных. Это то, что делают такие приложения, как pngcrush
.
В довершение всего, вы имеете дело с контентом, который уже отравлен артефактами и кодирующим осадком. Мой простой ответ на вопрос «Есть ли простой путь» должен быть №
Но если у вас есть множество видео с низкой степенью сжатия, таких как 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 \;
Но будет потеря. Вы просто должны судить, насколько это приемлемо.
Вы также можете сделать это с помощью 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