[О блоге] [наверх] [пред] [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 форматами.

    [оставить комментарий]