[О блоге]
[наверх]
[пред]
[2019-12-01 11:30:56+03:00]
[748a0008be8dd4408f9366e02a71144acec766a7]
Темы: [multimedia][tip]
Перекодирование видео в VP9 и mencoder
Из коробки mencoder вроде как не умеет кодировать в VP9 кодек, только
VP8. Либо, из-за скудности документации, я так и не нашёл как это
сделать. И вообще меня уже посещали мысли не забить ли на mencoder, с
которым я наверное с момента зарождения, и перейти на постоянно
развивающийся ffmpeg. Но пока держусь, последний меня пугает своей
непривычностью относительно mencoder.
Кодировать в VP9 может родная (libvpx) vpxenc команда. На вход она ждёт
сырой видеопоток, который mplayer-ом получить легко: mplayer -vo yuv4mpeg.
По умолчанию видео будет отправлять в stream.yuv. Само собой вряд ли
имеет смысл хранить это как файл, поэтому я всегда делал mkfifo stream.yuv
чтобы данные через FIFO этот просасывались между программами.
Но вот тут у меня видео в 30 FPS есть, и я решил сделать из него 24/25
FPS, ибо нафиг нужен этот 30 (операция inverse telecine). Никогда прежде
не делал. mplayer-у на лету такую задачу похоже нельзя выполнить --
нужно именно перекодировать. mencoder-ом с ходу я смог не в 25, но в 24
перекодировать вот так:
mencoder -fps 30000/1001 -vf filmdint ... -ofps 24000/1001 ...
Но, раз это перекодирование, то он, по умолчанию, будет и пересжимать, а
я хочу кодировать в VP9.
Так что кодирую в lossless кодек. С этим я тоже никогда не встречался.
Из коробки есть huffyuv -- скорость кодирования очень высокая; ffvhuff
-- небольшое изменение huffyuv дающее 20% выигрыш в занимаемом месте;
ffv1 -- ощутимо лучше жмёт, но медленнее. ffv1 ощутимо у меня жрёт
процессор и в real-time 1920x1080 я с ним проиграть не могу. Но раз мне
это надо только как промежуточный формат, то выбираю ffvhuff. Который
сразу начинаю проигрывать для создания yuv4mpeg потока, который пойдёт в
vpxenc.
Ещё один нюанс: по умолчанию mencoder создаёт AVI контейнер. mplayer при
его проигрывании после пары гигабайт молча выходит. Я не уверен, но
думаю что это 32-х битные ограничения самого контейнера, ибо когда я
явно сказал создавать Matroska, то всё работает без выхода.
В итоге моя команда mencoder по превращению 30000/1001 FPS в 24000/1001
FPS вот такая:
mkfifo huge.mkv
mencoder -mc 0 -noskip \
-fps 30000/1001 \
-vf filmdint \
-oac pcm \
-ovc lavc -lavcopts vcodec=ffvhuff \
-ofps 24000/1001 \
-of lavf -lavfopts format=matroska \
-o huge.mkv defcon.mp4
huge.mkv я преобразую в yuv4mpeg:
mkfifo stream.yuv
mplayer -noframedrop -vo yuv4mpeg -nosound huge.mkv
кодирую первым проходом в VP9:
vpxenc \
--yv12 \
--codec=vp9 \
--good \
--cpu-used=0
--end-usage=vbr \
--target-bitrate=1000 \
--passes=2 \
--pass=1 \
--fpf=out.fpf \
--threads=4 \
-o out.vp9.vp9 stream.yuv
и повторяю всё тоже самое для второго прохода.
Скорость кодирования в VP9 очень медленная. Поэтому его я решил делать
на одном из своих домашних серверов с 4-х ядерными Xeon-ами. Но
устанавливать туда mencoder/mplayer не хочется. libvpx без зависимостей
и его я установил. Но, чтобы меньше греть процессор дважды на inverse
telecine и кодирование в HuffYUV, которые я делаю на ноутбуке и
разультат через netcat отправляю по сети на сервер, я решил stream.yuv
реально в виде файла сохранить. Для 1:50 фильма он занял: 462 GiB. Но,
на ZFS с recordsize=1M и compression=lz4 он занимает более чем в два
раза меньше (du -h): 220G.
Может тогда и не имеет смысл перегонять в HuffYUV и сразу сохранять в
сыром формате выхлоп mencoder в этом случае? Скорее всего, очевидно, но
до этого я допёр только под конец. Зато поигрался с lossless форматами.
[оставить комментарий]