sitelogo

By

Сжатие видео с помощью MPlayer и x264\x265

В Linux имеется один интересный способ перекодирования видео в консоли с помощью плеера MPlayer (могут быть и альтернативы), стандартного ввода-вывода и кодеков x264\x265 без какого либо дополнительного софта с GUI. Данный способ позволяет ускорить и без того долгий процесс, минимизировав накладные расходы. А использование плеера позволяет направлять на вход этой цепочки большое количество различных форматов файлов, для которых в VirtualDub приходится ставить различные плагины, а некоторые наверняка и вовсе прочесть будет невозможно.

Какие видео фильтры будем использовать и как устроить предпросмотр?

Для этого нужно прочитать man mplayer. Где-то там внизу в мане есть описание многих фильтров. Я их заново описывать не буду, т.к. передо мной сейчас и так открыта эта документация на русском и мне кажется, она довольно большая. Перечислю наиболее часто используемые мной фильтры:

1) Crop: для срезания с видео ненужных частей, черных полос. Нормальные плееры сами достраивают их, если обнаруживают различия в пропорциях экрана и исходного видео. Удаляйте их, иначе получите пустую трату места и получите «boxed» эффект, если проиграете видео не на том мониторе (появляются еще и полосы сбоку).

2) Scale: изменить размер изображения. Имеет смысл только уменьшать изображение, увеличивать его — напрасная трата сил и места на диске. Можно изменять размер только по одной стороне — по вертикали или горизонтали, указав -2 в качестве парамера. Используется хороший Bicubic алгоритм. Также не забывайте про возможность установить Aspect Ratio. Это позволяет избежать пересжатия видео только для того, чтобы поменять разрешение. Устанавливается как параметр для MKV контейнера.

3) Hqdn3d лучший в mplayer фильтр для шумоподавления видео, что увеличивает степень сжания вместе с опциями кодека до 20%. Лучше не использовать значения по умолчанию 4:3:6 для фильмов, это заметно мылит их, особенно старые, но отлично давит шум на мультяшках. Для фильмов лучше использовать шумодав Neat Video. Для связки Neat Video и Linux можно использовать Wine + avisynth + avs2yuv.

Ну и конечно есть куча других фильтров — деинтерлейс, детелесин, яркость-контраст и прочие, на некоторые даже не найдешь документации.

В общем, чтобы посмотреть что будет на выходе, в качестве примера делаем:

1
:~$ mplayer -nosub -vf scale=1024:-2,hqdn3d=2:2:2

Что вбивать в командную строку кодеков?

Рассмотрим на примере x264 и vorbis-tools (Ogg-vorbis тоже отличный бесплатный кодек, также хорошо сжимает и на низких битрейтах, не особо хуже, чем Nero AAC).

Во-первых, какой битрейт выбрать? Мне нравится вообще всегда использовать режим «постоянное качество потока» (constant quality). Потому что постоянный битрейт (CBR) применяется только для потокового вещания по сети и не эффективен во многих случаях. Стопроходное кодирование для нарезки на болванку уж больно долгое, нарезать можно так, чтобы на одной болвашке помещалось сразу несколько фильмов. Если одно видео занимает у вас по 4 гигабайта, используйте блюрей. Если есть множество файлов, то есть возможность подобрать файлы, чтобы заполнить всю болванку. Примеры:

1
2
:~$ oggenc --ignorelength -q 4 -o audio1.ogg audio.fifo
:~$ x264 video.fifo --demuxer y4m --crf 15 --preset veryslow --threads auto --nr 400 --output video1.264

Где опции качества у меня выставлены в 15 для x264 и 4 для vorbis. В vorbis-tools 1.4.0 есть баг, —ignorelength опция там не работает, но у меня есть патченные исходники :).

Ставим на перегонку.

Когда параметры фильтров подобраны, можем начать перегонять видео. Открываем первый терминал, забиваем:

1
2
3
:~$ mkfifo audio.fifo
:~$ mkfifo video.fifo
:~$ mplayer -slave -nosub -vf scale=1024:-2,hqdn3d=2:2:2 -vo yuv4mpeg:file=video.fifo -aid 0 -channels 7 -ao pcm:file=audio.fifo "srcfile.mkv"

Второй терминал:

1
:~$ oggenc --ignorelength -q 4 -o out.ogg audio.fifo

Третий терминал:

1
:~$ x264 video.fifo --demuxer y4m --crf 15 --preset veryslow --threads auto --nr 400 --output out.264

Все, теперь сидим и смотрим уходим на прогулку\работу.

Как изменить частоту кадров?

К огромному сожалению, mplayer не может изменять частоту кадров. Зато mencoder может. Правда, он не может выводить в формате yuv4mpeg. Зато он может кодировать сразу тем кодеком, который выберем. Хотя мне всеравно нравится использовать x264 в том консольном виде, в котором он есть. Получается, можно только воспользоваться древним методом — достать винт на 500 GB, вывести в AVI контейнер несжатое видео и затем закодировать его mplayer’ом + x264. Еще можно извратиться по-другому и направить поток с mencoder в mplayer в RAW формате (вообще несжатые кадры без контейнера), указав разрешение видео, или направить сразу сырой формат в x264, но тут есть какой-то баг, при котором кто-то портит видео если приостановить кодирование по CTRL+Z.

1
:~$ mencoder -nosound -ovc raw -fps 23.972540 -ofps 24000/1001 -vf scale=1024:-2,hqdn3d=2:2:2,format=i420,harddup -o tmp.avi "sourcevideo.m4v"

Нужно обязательно выставить значения -fps (значение в оригинале) и -ofps (значение, которое будет в вашем видео). В примере сверху я корректирую чью-то попытку синхронизировать видео и аудио с помощью подгонки частоты кадров (или может кто-то просто написал 23.972 вместо 24000/1001?). Менять таким образом частоту кадров с 24000/1001 до 25 не следует, будет вставлено очень много лишних кадров. Значение исходного fps я брал прямо из VLC Media Player.

Чтобы просто изменить частоту кадров без изменения видео, нужно выставить опцию -fps в mplayer. Или изменить ее, когда будем зашивать потоки в выходной контейнер.

Как редактировать видео?

Тут без программы-аналога VirtualDub под Linux Avidemux обойтись трудно. Хотя, если видеть номер текущего кадра в плеере и иметь фильтр для пропуска пачек кадров в исходном видео, можно обойтись даже без редактора. И это при том, что на самом деле пользоваться консолью не так уж сложно.

Как загнать потоки в контейнер?

Для контейнера MKV есть отличный пакет программ mkvtoolnix, в нем есть как консоль так и GUI.

Где взять субтитры?

Если в исходном файле текстовых субтитров нет, то лучше скачать готовые. Зачастую полученные субтитры запаздывают или обгоняют звук, чтобы это исправить, можно использовать софт subtitleeditor, в нем можно менять частоту кадров для субтитров. Еще субтитры бывают в какой-нибудь кодировке типа Windows-1251, а MKV с ними плохо дружит, их можно очень просто перегнать в UTF-8 так:

1
:~$ iconv -f windows-1251 -t utf-8 "исходник.srt" > dest_rus_utf8.srt

С DVD субтитры лучше не рипать, там субтитры лежат в графическом формате, это просто полный баттхёрт их потом редактировать.



2 Responses to Сжатие видео с помощью MPlayer и x264\x265

  1. Максим пишет:

    Ну автор конечно загнул с командами… :)
    давно есть avidemux и GUI к нему на qt и gtk

    • viron пишет:

      Ну… автор знает толк в извращениях :)
      Консоль куда более гибкая вещь, чем любой GUI. Особенно, когда нужно объединить множество разного софта в одну цепочку обработки с помощью | (stdio). И затем еще пройтись этой цепочкой по множеству файлов.

Добавить комментарий

Ваш e-mail не будет опубликован.