Что: 748a0008be8dd4408f9366e02a71144acec766a7
Когда: 2019-12-01 11:30:56+03:00
Темы: 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 форматами.
Сгенерирован: SGBlog 0.34.0