Обновить

Кодирование x264 + Vorbis

Работа с видео
Из песочницы
Привет Хабр.
Собственно написать первый пост я решил после того, как прочитал этот. В нем автор постарался изложить своё видение, но, на мой взгляд, не преуспел.

Итак, дано: BDRemux, 1080p, 25 серий.
Задача: Сделать максимально качественный рип 480p(или 720р), в 10 бит.

Сразу оговорюсь, что кодировать будем аниме.

Для работы нам понадобятся:
1. x264, для кодирования видеопотока.
2. ffmpeg, будем использовать только для кодирования звука, так на мой взгляд проще.
3. mkvtoolnix, для сборки этого чуда в контейнер mkv.

Так как серий у нас много, напишем несложный батник, который пригодится для последующих рипов.

Видео


Сначала приведу код, потом поясню параметры:

"...\x264-10b.exe" "...\имя файла источника.m2ts" --input-res 1920x1080 --fps 23.976 --profile high10 --preset medium --tune animation --crf=15.5 --me=umh --ref=9 --deblock=-1,-1 --merange=24 --bframes=12 --trellis=1 --video-filter resize:width=854,height=480,method=lancoz --output "...\имя выходного файла.264"


Параметры

--input-res 1920x1080 --fps 23.976

Подсказываем x264 разрешение и частоту кадров источника. (можно подсмотреть в MediaInfo)

--profile high10

Варианты: baseline, main, high, high10, high422, high444.
Указываем профиль. В данном случае кодируем в 10 бит, поэтому high10, если в 8 — high.

--preset medium

Варианты: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo.
Баланс скорости кодирования и качества. Т.е. выше скорость — хуже качество.
В основном использую medium, slow и иногда veryslow.

--tune animation

Варианты: film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency.
Предустановки, зависящие от входного видео. Для фильмов одно, для аниме другое.

--crf=15.5

Диапазон: 1-50.
Режим постоянного качества и его уровень. Чем меньше — тем лучше качество. Позволяет каждому кадру использовать собственный QP, основанный на сложности кадра.
Подробнее на английском можно почитать тут.
Это лучший метод для однопроходного кодирования.
Возможные варианты на замену: --bitrate или --qp, рассматривать их не будем.

Далее переопределим некоторые параметры, т.к. не все они из пресета medium нам подходят:

--me=umh

Варианты: dia, hex, umh, esa, tesa.
Метод оценки движения полного пикселя. Рекомендую umh.

--ref=9

Диапазон: 1-16.
Количество референсных кадров. Чем больше, тем медленнее будет кодировать. Если следовать спецификациям для поддержки бытовой техники, 4 — максимум для 1080p, и 9 — максимум для 720p.
При 6 и выше особой разницы в качестве не увидите, а скорость кодирования сильно упадет.

--deblock=-1,-1.

Деблокинг, в формате сила:порог. Если коротко, то чем выше сила деблокинга, тем сильнее он применяется, чем выше порог, тем больше блоков ему попадается.
Хорошо расписано тут.
Так как мы кодируем BDRemux аниме, силу и порог желательно снизить, чтобы уменьшить размытие линий. Я использую -1:-1, но встречались рипы и с -2:-2.

--merange=24

Диапазон: 4-64.
Определяет максимальное количество попыток нахождения оптимального варианта при поиске вектора движения макроблока. Чем больше, тем лучше качество.
Не имеет особого смысла ставить больше 24.

--bframes=12

Диапазон: 1-16.
Устанавливает максимальное число параллельных B-фреймов. Большое значение может привести к значительному улучшению эффективности степени сжатия.

--trellis=1

Диапазон: 0-2.
Треллис квантование для повышения эффективности сжатия. 0 — отключено. 1 — Вариант «на макроблоках». 2 — «везде».
1 — хороший компромисс между потерей скорости и эффективностью сжатия. Лучше всего 2, но совместно с --psy-rd, иначе замылит мелкие детали.

Ресайз

--video-filter resize:width=854,height=480,method=lancoz

Указываем ширину и высоту, а так же метод. Я использую lancoz.
Варианты: fastbilinear, bilinear, bicubic, experimental, point, area, bicublin, gauss, sinc, lanczos, spline.

Аудио


Для кодирования будем использовать ffmpeg.

"...\ffmpeg\bin\ffmpeg.exe" -i "...\имя файла источника.m2ts" -vn -c:a libvorbis -qscale:a 6 "...\имя выходного файла.ogg"


Тут всё просто:

-vn

Отключаем кодирование видео.

-c:a libvorbis -qscale:a 6

Указываем кодер и качество.
Диапазон: 0-10.
Чем больше, тем лучше качество.
6 это ~192 Кбит/с.

Сборка:


Кодируем первую серию.

Открываем GUI mkvtoolnix, выбираем получившиеся видео и аудио, задаем параметры (например, для видео полезно будет задать аспект и частоту кадров, а для аудио — язык дорожки) и жмем скопировать в буфер обмена, получаем что-то вроде:

"...\mkvtoolnix\mkvmerge.exe" -o "...\имя выходного файла.mkv"  "--default-track" "0:yes" "--forced-track" "0:no" "--aspect-ratio" "0:16/9" "--default-duration" "0:23.976fps" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...\имя перекодированного видео.264" ")" "--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...\имя перекодированного аудио.ogg" ")" "--track-order" "0:0,1:0"

Полный код для 25 серий:

@echo off
for /L %%i in (1,1,9) do (
"...\ffmpeg\bin\ffmpeg.exe" -y -i "...\имя 0%%i.m2ts" -vn -map 0:2 -c:a libvorbis -qscale:a 6 "...\имя 0%%i.ogg"
"...\x264\x264-10b.exe" "...\имя 0%%i.m2ts" --input-res 1920x1080 --fps 23.976 --profile high10 --preset medium --tune animation --crf=15.5 --me=umh --ref=9 --deblock=-1,-1 --merange=24 --bframes=12 --trellis=1 --video-filter resize:width=854,height=480,method=lancoz --output "...\имя 0%%i.264"
"...\mkvtoolnix\mkvmerge.exe" -o "...\имя 0%%i.mkv"  "--default-track" "0:yes" "--forced-track" "0:no" "--aspect-ratio" "0:16/9" "--default-duration" "0:23.976fps" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...\имя 0%%i.264" ")" "--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...\имя 0%%i.ogg" ")" "--track-order" "0:0,1:0"
)
for /L %%i in (10,1,25) do (
"...\ffmpeg\bin\ffmpeg.exe" -y -i "...\имя %%i.m2ts" -vn -map 0:2 -c:a libvorbis -qscale:a 6 "...\имя %%i.ogg"
"...\x264\x264-10b.exe" "...\имя %%i.m2ts" --input-res 1920x1080 --fps 23.976 --profile high10 --preset medium --tune animation --crf=15.5 --me=umh --ref=9 --deblock=-1,-1 --merange=24 --bframes=12 --trellis=1 --video-filter resize:width=854,height=480,method=lancoz --output "...\имя %%i.264"
"...\mkvtoolnix\mkvmerge.exe" -o "...\имя %%i.mkv"  "--default-track" "0:yes" "--forced-track" "0:no" "--aspect-ratio" "0:16/9" "--default-duration" "0:23.976fps" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...\имя %%i.264" ")" "--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "...\имя %%i.ogg" ")" "--track-order" "0:0,1:0"
)
pause

Поскольку у меня две кривые руки, один и тот же код написан дважды.

Всем спасибо за внимание.

UPD:

--input-res 1920x1080 --fps 23.976

Можно не указывать. Это необходимо только если вы скармливаете x264 чистый raw поток.

--profile high10

Так же можно не указывать, т.к.
Битность определяется на этапе компиляции и скодировать в 8 и 10 одним бинарником не выйдет. Так что и смысла выставлять профиль в принципе нет (если только не надо 4:2:2 или 4:4:4).

Спасибо tp7.

Также, на мой взгляд, имеет смысл поднять --subme до 9.
Подробнее обо всех параметрах можно почитать здесь на английском.
Теги:x264ffmpegmkvtoolnix
Хабы: Работа с видео
Рейтинг +14
Количество просмотров 20,8k Добавить в закладки 69
Комментарии
Комментарии 31

Похожие публикации

Java разработчик
от 200 000 ₽НТВМосква
iOS-разработчик (удаленная работа, полная занятость)
от 150 000 до 230 000 ₽42TapsМожно удаленно
С/С++ Developer
от 1 500 до 2 500 $MotionRayМоскваМожно удаленно
iOS-разработчик
от 110 000 до 150 000 ₽InstreamaticТулаМожно удаленно
Middle React Native / Flutter developer, full-time, дистанционно
от 1 500 до 2 000 $Триумф-МаркетингМожно удаленно

Лучшие публикации за сутки