[Из песочницы] Кодирование x264 + Vorbis
Привет Хабр.Собственно написать первый пост я решил после того, как прочитал этот. В нем автор постарался изложить своё видение, но, на мой взгляд, не преуспел.Итак, дано: BDRemux, 1080p, 25 серий.Задача: Сделать максимально качественный рип 480p (или 720р), в 10 бит.
Сразу оговорюсь, что кодировать будем аниме.Для работы нам понадобятся:1. x264, для кодирования видеопотока.2. ffmpeg, будем использовать только для кодирования звука, так на мой взгляд проще.3. mkvtoolnix, для сборки этого чуда в контейнер mkv.
Так как серий у нас много, напишем несложный батник, который пригодится для последующих рипов.
ВидеоСначала приведу код, потом поясню параметры: »…\x264–10b.exe» »…\имя файла источника.m2ts» --input-res 1920×1080 --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 1920×1080 --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 1920×1080 --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 1920×1080 --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 Поскольку у меня две кривые руки, один и тот же код написан дважды.Всем спасибо за внимание.