Я пытаюсь преобразовать мою библиотеку видео в формат HEVC, чтобы освободить место. Я выполнил следующую команду для всех видеофайлов в моей библиотеке:
#!/bin/bash
for i in *.mp4;
do
#Output new files by prepending "X265" to the names
avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done
Сейчас большинство видео конвертируются нормально, а качество остается прежним. Однако несколько видео очень высокого качества (например, один фильм размером 5 ГБ) теряет качество - все видео имеет пикселизацию.
Я не уверен, что делать в этом случае. Мне нужно изменить crf
параметр в моей командной строке? Или что-то другое?
Дело в том, что я делаю массовое преобразование. Итак, мне нужен метод, в котором avconv
автоматически настраивается любой параметр, который требуется настроить, для каждого видео.
UPDATE-1
Я обнаружил, что crf
это ручка, которую мне нужно отрегулировать. CRF по умолчанию равен 28. Для лучшего качества я мог бы использовать что-то меньше 28. Например:
avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Однако проблема заключается в том, что для некоторых видео значение CRF достаточно хорошее, в то время как для некоторых видео требуется более низкая CRF. Это то, что я должен проверить вручную путем преобразования небольших разделов больших видео. Но в массовом преобразовании, как бы я проверил каждое видео вручную? Есть ли какой-то способ, которым avconv
можно грамотно настроить CRF в соответствии с входным видео?
ОБНОВЛЕНИЕ-2
Я обнаружил, что --lossless
в x265 есть опция: http://x265.readthedocs.org/en/default/lossless.html .
Однако я не знаю, как правильно его использовать. Я попытался использовать его следующим образом, но это дало противоположные результаты (видео было еще более точечным):
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
источник
--lossless
может на самом деле увеличить файл, если он декодирует ранее кодек с потерями, а затем включает то, что он декодировал без потерь. Качество останется таким же, как на входе.Ответы:
Исходя из моего собственного опыта, если вы хотите абсолютно без потерь в качестве, --lossless - это то, что вы ищете.
Не уверен,
avconv
но введенная вами команда выглядит идентично тому, что я делаюFFmpeg
. ВFFmpeg
вы можете передать параметр , как это:Большинство
x265
ключей (опции без значения) могут быть указаны следующим образом (кроме тех, которые предназначены только для CLI, они используются только сx265
двоичным кодом напрямую).В связи с этим я бы хотел поделиться своим опытом с
x265
кодированием. Для большинства видео (будь то WMV, или MPEG, или AVC / H.264) я используюcrf=23
.x265
определяет остальные параметры и обычно выполняет достаточно хорошую работу.Однако часто, прежде чем я решу полностью перекодировать видео, я проверяю свои настройки, конвертируя небольшую часть рассматриваемого видео. Вот пример, предположим, что файл mkv с потоком 0 является видео, поток 1 является аудио DTS, а поток 2 является субтитром:
Обратите внимание, что обратная косая черта прерывается в длинной команде, я делаю это, чтобы помочь мне отслеживать различные биты сложного ввода CLI. Прежде чем я объясню это построчно, часть, где вы конвертируете только небольшую часть видео, является второй строкой и второй последней строкой:
-ss 0
означает поиск до 0 секунд перед тем, как начать декодирование ввода, и-t 120
означает прекращение записи в вывод через 120 секунд. Вы также можете использовать форматы времени чч: мм: сс или чч: мм: сс.ссс.Теперь построчно:
-hide_banner
не позволяетFFmpeg
показывать информацию о сборке при запуске. Я просто не хочу видеть это, когда прокручиваю вверх в консоли;-ss 0
ищет 0 секунд до начала декодирования ввода. Обратите внимание, что если этот параметр задан после входного файла и перед выходным файлом, он становится опцией вывода и указываетffmpeg
декодировать и игнорировать ввод до x секунд, а затем начать запись в вывод. Как вариант ввода он менее точен (поскольку поиск не точен в большинстве форматов контейнеров), но почти не занимает времени. Как вариант вывода, он очень точен, но занимает много времени для декодирования всего потока до указанного времени, и для целей тестирования вы не хотите тратить время;-i "INPUT.mkv"
: Укажите входной файл;-attach "COVER.jpg"
: Прикрепите обложку (миниатюру, плакат, что угодно) к выводу. Обложка обычно отображается в файлах;-map_metadata 0
: Скопируйте все метаданные из ввода 0, который в данном примере является просто вводом;-map_chapters 0
: Скопировать информацию главы (если имеется) со входа 0;-metadata title="TITLE"
: Установить заголовок видео;-map 0:0 ...
: Сопоставить поток 0 ввода 0, что означает, что мы хотим, чтобы первый поток ввода был записан в вывод. Так как этот поток является видеопоток, это первый видео поток в выходе , следовательно , поток спецификатор:s:v:0
. Установите его языковой тег на английский;-map 0:1 ...
: Аналогично строке 8 сопоставьте второй поток (аудио DTS) и установите его язык и заголовок (для упрощения идентификации при выборе из проигрывателей);-map 0:2 ...
: Аналогично строке 9, за исключением того, что этот поток является субтитром;-metadata:s:t:0 ...
: Установить метаданные для обложки. Это требуется для формата контейнера mkv;-c:v libx265 ...
: Параметры видео кодека. Это так долго, что я разбил его на две строки. Эта настройка хороша для высококачественного синего видео (1080p) с минимальной полосой в градиенте (что при х265 хреново). Скорее всего, это перебор для DVD, телешоу и телефонных видео. Этот параметр в основном украден из этого поста в Doom9 ;crf=22:...
: Продолжение параметров видеокодека. Смотрите сообщение на форуме, упомянутое выше;-c:a copy
: Скопировать аудио;-c:s copy
: Копировать субтитры;-t 120
: Прекратить запись на выход через 120 секунд, что дает нам 2-минутный клип для предварительного просмотра качества транскодирования;"OUTPUT.HEVC.DTS.Sample.mkv"
: Имя выходного файла. Я помечаю свои имена файлов видеокодеком и основным аудиокодеком.Уф. Это мой первый ответ, поэтому, если я что-то пропустил, оставьте комментарий. Я не эксперт по производству видео, я просто парень, которому лень смотреть фильм, вставляя диск в плеер.
PS. Возможно, этот вопрос относится к чему-то другому, поскольку он не сильно связан с Unix и Linux.
источник
c:s copy
если нет субтитров?--lossless
. Я тщетно искал преобразование без потерь из h264 в h265, и то, что я узнал, говорит мне, что это математически невозможно.--lossless
переключатель, из этого ответа, потому что если вы поставите его как ответ на этот вопрос, это звучит так, как будто вы говорите, что это сжатие без потерь, которое вводит в заблуждение.Недавно я пережил проблему перекодировки всего моего видео каталога в HEVC. Я использую https://github.com/FallingSnow/h265ize со следующими настройками.
h265ize -v -m medium -q 20 -x --no-sao --aq-mode 3 - удалить --stats
-v - подробный вывод
-m средний - средняя скорость кодирования (меньшее, более высокое качество, все, что медленнее, на мой взгляд, не стоит времени / качества dif)
-q 20 - используемый CRF, 20 похож на 18 или около того в x264, но эй. Это для контента в формате 1080p (90% моего телевизора). Я обычно использую 22 для своих фильмов 4K
-x - Использовать централизованно определенные команды x265 - no
-sao выключает Sample Adaptive Offset (улучшает скорость кодирования)
--aq-mode 3 - использовать Adaptive Quantisation с автоматической дисперсией, помогает 8-битному кодированию, особенно в темных областях, останавливает большинство возможных полос (за счет времени кодирования)
--delete - заменить файл кодирования на закодированный файл (проверить перед использованием этого) )
--stats - Записать статистику в CSV-файл в корне пути, по которому вы бежали.
Скорость кодирования составляет около 30 кадров в секунду (для большинства материалов 1080p) на моей установке. Dual Xeon E5 2687W v2, но я заставляю процесс FFMPEG не использовать первую сторону одного из процессоров (это мой сервер Plex, поэтому необходимо убедиться, что при воспроизведении и т. Д. Требуются дополнительные затраты на перекодировку)
Да, потребовалось некоторое время, чтобы преобразовать большую часть этого, и теперь у меня есть запланированное задание, которое выполняется два раза в день, чтобы закодировать материал с того дня в x265.
Экономия пространства была огромной. Первоначально SAN использовался при 20 ТБ, сейчас - около 12, но, очевидно, он также был добавлен с дополнительным контентом на 6 месяцев.
Я также начал перекодировать все свои фильмы, но это непрерывный процесс, так как я должен идентифицировать уровни качества (к счастью Radarr, а потом хорошо), и использовать одну из трех настроек транскодирования:
-m slower -q 18 -x --no-sao --aq-mode 3
для транскодов 720p-m medium -q 20 -x --no-sao --aq-mode 3
для 1080p-m medium -q 22 -x --no-sao
для 2160pНадеюсь, что это помогает некоторым людям. Кричите, если кому-то нужна рука, все настраивающее. И прежде чем кодировать все в x265, подумайте о воспроизведении. Если клиент не поддерживает родной x265, то транскадирование может быть дорогим с точки зрения процессора и качества.
источник
-q 20
это не CRF 20, это постоянная скорость контроля QP . Стандартный и рекомендуемый режим, CRF, повышает QP в сценах высокой сложности, поэтому он не тратит слишком много битов на сцены, которые слишком сложно кодировать. (Если вы хотите приблизиться к равномерному QP, поднимитесьqcomp
с 0,6 по умолчанию до 0,7 или 0,8. Ближе к 1,0 ближе к CQP.)Правильный синтаксис для включения режима без потерь для кодера x265 в ffmpeg:
-x265-params lossless=1
(необходимо добавить=1
).Однако для кодирования без потерь существуют лучшие варианты кодеков. В ходе тестирования я обнаружил, что FFV1 сжимает намного лучше (размер файла = ~ 80% от x265), по крайней мере, для некоторых видов видео (если для обоих кодеков выбраны лучшие настройки). И это также работает быстрее, и (AFAIK) не обременен патентами. То есть он превосходит H.265 без потерь во всех отношениях для архивирования видео.
источник