MPlayer и MEncoder: решая типовые задачи по кодированию 1
Программное обеспечение
Статья была опубликована 10 января 2013 года в 12:00, а последний раз правилась 10 февраля 2020 года в 03:31.
Постоянная ссылка: http://www.nixp.ru/articles/103.html
Работа с консольными утилитами MPlayer для преобразования видео: запись потока IP-телевидения (IPTV), конвертирование в разные форматы и с DVD, разбивка видео на части, выбор звуковых дорожек и т.п.
Примечание: эта статья была впервые опубликована в электронном издании «Open Source» от журнала «Системный администратор» и размещена на nixp.ru по согласованию с редакцией.
Предыстория
Давно канули в Лету те времена, когда я скачивал каждую новую версию MPlayer (www.mplayerhq.hu) и устанавливал её из исходника. Тогда было интересно: постоянно появлялись новые функции, дискуссии разработчиков с внешним миром (то ребята из Debian криво собирали пакеты MPlayer, то журналист Джой Барр обидел программистов…). Постепенно накал страстей прошел, и MPlayer отошел в тень: пользователи предпочли VLC или нечто, установленное по умолчанию (например, Totem). MPlayer остался в каждом дистрибутиве Linux, он даже обычно устанавливается по умолчанию, но про него все реже вспоминают, новообращенные линуксоиды могут и вовсе не догадываться.
Однако меньшее внимание к проекту со стороны пользователей нисколько ему не вредит. MPlayer развивается дальше, а часть его разработчиков одновременно входит в состав команды создателей FFmpeg, значение которого в области воспроизведения/обработки мультимедиа нельзя недооценить: кодеки из состава FFmpeg используются во множестве плееров (например, в уже упомянутом VLC), а FFmpeg используется для для обработки видео в таких онлайн-сервисах, как YouTube и Facebook. К слову, сотрудничество между проектами более тесное, чем кажется на первый взгляд — например, в git-хранилище VLC хостится и FFmpeg (git://git.videolan.org/ffmpeg.git).
Что до MPlayer и FFmpeg, то MPlayer, конечно же, использует кодеки из FFmpeg и даже сам скачивает его исходник, если вы компилируете MPlayer. Кроме того, часть кода самого MPlayer постепенно удаляется по мере того, как эти же функции появляются в FFmpeg. Например, раньше MPlayer «таскал» с собой копию libfaad2, но когда в FFmpeg соответствующий кодек стал стабильным, MPlayer без сожаления расстался со встроенным libfaad2. MPlayer читает любые форматы видео и звука, которые порой не под силам распознать другим программам. Эта всеядность и возможность конвертировать из одного формата в другой при помощи утилиты MEncoder делает MPlayer незаменимым средством работы с видео для тех, кто не боится командной строки.
Итак, в статье я расскажу, как использовать MPlayer для разных повседневных (и не очень) нужд. Несмотря на то, что для просмотра видео я чаще использую VLC, есть вещи, которые в MPlayer делаются удобнее.
Запись IPTV
Некоторое время назад я поменял провайдера и у меня появилось IP-телевидение. Бывает, что возникает необходимость записать какую-нибудь передачу, кусок новостей, редкий фильм… И здесь MEncoder, входящий в состав MPlayer, представляется отличным решением. Но сначала — как смотреть IP-телевидение с помощью MPlayer? Очень просто:
mplayer udp://адрес
Например:
mplayer udp://@233.252.8.10:1234
Это позволит «включить» конкретный канал. Где взять его адрес? Из плейлиста, который представляется провайдером. Обычно он имеет формат m3u. Из него с помощью любого текстового редактора можно вытащить конкретные адреса каналов. Либо воспользоваться пресловутым VLC: загрузить в него плейлист, открыть окно плейлиста, нажать правой кнопкой мыши на нужном канале, выбрать пункт меню «Информация» и скопировать адрес из самой нижней строки («Расположение»).
Чтобы воспроизвести в MPlayer сам плейлист, надо дать команду:
mplayer -playlist имя_файла.m3u
После этого каналы можно переключать курсорными клавишами вверх-вниз.
Чтобы записать транслируемое видео в файл, надо сделать дамп (прямой вывод потока в файл), используя параметры -dumpstream и -dumpfile. Например:
mplayer udp://@233.252.8.10:1234 -dumpstream -dumpfile out.mpg
Здесь мы записываем видео в файл out.mpg. Видео записывается «как есть», в исходном формате MPEG2. Чтобы прервать запись, надо нажать Ctrl-C. При этом саму картинку вы во время записи не видите. Самый простой способ решить эту проблему — запустить в параллель к MPlayer другой плеер (я для этого использую Xine) с записываемым файлом. Конечно, получается некоторая временная задержка между просматриваемым и записываемым, но есть хотя бы примерное представление, когда надо останавливать запись. Ненужный «хвост» можно потом обрезать в Avidemux (в режиме копирования, если вы не хотите конвертировать видео и звук в другой формат) или с помощью MEncoder.
Запись ТВ-потока реализуется и с MEncoder:
mencoder udp://@233.252.8.40:1234 -oac copy -o out.mpg -ovc copy
В таком случае видео сохранится в исходном формате. Впрочем, MEncoder позволяет сразу пережать его в нужный формат, что ухудшит качество картинки, но сэкономит место на диске. Вот пример команды для создания рипа с IPTV сразу в DivX/AVI с масштабированием видео к разрешению 512:385:
mencoder udp://@233.252.8.40:1234 -ffourcc DIVX -oac mp3lame \ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1000:vqmin=2:vqmax=25:vhq:v4mv:trell:autoaspect \ -vf scale=512:384 -lameopts cbr:br=192:aq=0 -o out.avi
При этом сам MPlayer/MEncoder должен быть собран с поддержкой библиотеки кодирования MP3 (lame). Поясню переданные параметры:
- -ffourcc DIVX — «жесткое» добавление в файл сигнатуры FOURCC, позволяющей программам получать сведения о кодеке, используемом в файле для сжатия данных. FOURCC расшифровывается как «four character code» — код из четырех символов, который занимает четыре байта. Наиболее распространенные значения: «DIVX», «XVID», «H264», «DX50» (подробнее см. www.fourcc.org).
- -oac mp3lame — конвертирование звука в MP3 с кодеком lame.
- -lameopts cbr:br=192:aq=0 — параметры конвертирования в lame: постоянный битрейт в 192 кбит/с; aq (algorithmic qulality), т.е. качество пересжатия в 0 (лучшее, но медленное).
- -ovc lavc — видеокодек, используемый для вывода.
lavcopts — это параметры видеокодека lavc (lavc — это фактически целый набор кодеков, требующий указания дополнительных опций):
- vcodec=mpeg4 — сжатие в MPEG4;
- vbitrate=1000 — значение битрейта;
- vqmin=2:vqmax=25 — параметры квантования (минимальный и максимальный «квантайзеры»); vqmin, равный двум, обычно ставят для MPEG4, а для H.263 выбирают 3; максимальный vqmax по умолчанию стоит 31 (чем меньше значение, тем меньше блоки, на которое разбивается кодируемое изображение, и тем четче получается картинка, но файл при этом становится большим по размеру);
- vhq — то же самое, что mbd=1; грубо говоря, включает режим, при котором макроблоки кодируются несколькими способами, и потом автоматически выбирается наилучший результат;
- v4mv — четыре вектора движения на макроблок;
- trell — треллис-квантование, для поиска оптимального кодирования блоков 8×8;
- autoaspect — автоматическое соотношение сторон.
Вообще о параметрах кодирования при помощи MEncoder можно говорить очень долго: этих параметров если не тысячи, то сотни, и каждый влияет на что-то в той или иной мере. Не думаю, что кто-то пользуется ими всеми сразу: одни параметры хороши для сжатия фильмов, другие — при сжатии мультиков, и так далее. Всё зависит от того, что вы кодируете и что хотите получить в результате.
Другие приемы работы с MEncoder
Некоторые плееры (например, от Microsoft) отказываются подставлять нужный для декодирования кодек без четко прописанного FOURCC. Но порой некоторые программы кодирования или рендеринга выдают результат без этого FOURCC. Решить проблему можно добавлением FOURCC к файлу без повторного кодирования:
mencoder исходный_файл.avi -ovc copy -oac copy -ffourcc DIVX -o файл_результата.avi
Как видно из команды, для того, чтобы избежать ненужного в данном случае кодирования, достаточно в качестве видео- и аудиокодеков выбрать простое копирование (-ovc copy -oac copy).
Как разбить один большой видеофайл на две части? Такая потребность возникает, например, при загрузке файла на хостинг, где есть ограничение на размер. Разберу на примере большого файла big_film.avi, который нужно разбить на два (part01.avi и part02.avi) по временному рубежу в 1 час, 13 минут, 16 секунд. Файл part01.avi создается с параметром -endpos, в котором указывается время для остановки копирования данных из исходного файла:
mencoder -ovc copy -oac copy -endpos 1:12:13 -o part01.avi big_film.avi
Файл part02.avi получается сходным образом, только с указанием, куда нужно «перемотать» видео, т.е. позицию, с начинать копирование данные (параметр -ss):
mencoder -ovc copy -oac copy -ss 1:12:13 -o part2.avi movie.avi
Впрочем, то же самое можно сделать в Avidemux — разница по времени и простоте не так уж велика. А вот, например, задачу по замене аудиодорожки сделать быстрее, как мне кажется, именно в MEncoder. Например, вы скачали фильм и отдельно к нему звуковую дорожку с лучшим переводом. Как заменить старую дорожку на новую?
mencoder исходный_файл.avi -ovc copy -oac copy \ -audiofile файл_с_новой_дорожкой.mp3 -o выходной_файл.avi
Кстати, про файлы с несколькими звуковыми дорожками. Выбрать для воспроизведения нужную при запуске можно командой:
mplayer -aid 2 имя_файла.avi
После -aid указывается номер дорожки. При самом воспроизведении вы можете циклично перебирать звуковые дорожки нажатием на Shift-3 («#»).
Пример другой актуальной задачи, решаемой с помощью MEncoder, — конвертирование DVD в MPEG4/AVI. Команда для конвертирования реального диска, вставленного в привод:
mencoder dvd://номер -ffourcc DIVX -oac mp3lame -ovc lavc \ -lavcopts vcodec=mpeg4:vbitrate=1000:vqmin=2:vqmax=25:vhq:v4mv:trell:autoaspect \ -vf scale=512:384 -lameopts cbr:br=128:aq=0 -o имя_файла.avi
Если же содержимое DVD (все VOB-файлы) уже скопировано на жесткий диск в определенный каталог, то команда конвертирования будет такой:
mencoder dvd://номер -dvd-device путь_к_каталогу -oac mp3lame \ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=900:vqmin=2:vqmax=25:vhq:v4mv:trell:autoaspect \ -vf scale=512:384 -lameopts cbr:br=128:aq=0 -ffourcc DIVX -o имя_файла.avi
Если же DVD помещен в ISO-образ, просто используем:
mencoder имя_образа.iso <остальные_параметры>
При конвертировании DVD помните о номере главы и звуковой дорожке — всё это выбирается через командную строку. Кстати, иногда VLC отказывается воспроизводить ISO-образы, а вот MPlayer/MEncoder те же образы «понимает».
На сегодня MPlayer является, пожалуй, наиболее всеядным плеером в области поддержки различных форматов контейнеров и кодеков. Полезный список кодеков можно найти в сети: www.mplayerhq.hu/DOCS/codecs-status.html. Поддерживается также аппаратное декодирование, если у вас видеокарта от NVIDIA. Чтобы переложить декодирование видео на плечи видеокарты, надо использовать устройство «vpau» в качестве выходного устройства. Например:
mplayer -vo vdpau имя_файла.mkv
Если в файле используется кодек H.264, то цепочка параметров будет такой:
mplayer -vo vdpau -vc ffh264vdpau имя_файла.mkv
Результат — практически нулевая нагрузка на процессор компьютера. Если, конечно, ваша видеокарта поддерживает API VDPAU (Video Decode and Presentation API for Unix) и это API работает на уровне драйверов. Во время написания статьи карты от AMD не могут этим похвастаться, хотя некоторые подвижки есть.
GMPlayer тоже жив
В заключении статьи отвлекусь от консоли и вспомню про «классический» графический интерфейс к MPlayer — GMPlayer (пакет с ним обычно именуется mplayer-gui). Внешний вид у него довольно аскетичный, но удобный. Некогда проект активно развивался, было много предустановленных тем оформления, но потом развитие интерфейса приостановилось, его не популяризировали. Тем не менее, он существует и по сей день, а недавно была снова замечена работа над исходниками. Темы оформления для GMPlayer можно скачать на gnome-look.org. К слову, в GMPlayer работают те же клавиши управления, что в консольном MPlayer.
Дополнение. Полезные клавиши для MPlayer
Во время воспроизведения видео с помощью MPlayer с клавиатуры можно выполнять различные операции. Среди них:
- [ и ], { и } — ускорение воспроизведения на 10 процентов, или на половину;
- Backspace — возвращение к нормальной скорости;
- курсоры вверх-вниз — прокрутка видео на минуту вперед/назад (в IPTV-режиме переключает каналы);
- PgUp, PgDown — прокрутка на 10 минут вперед-назад;
- + и — — подстройка синхронизации звуковой дорожки с видео (шаг в 0,1 секунды);
- v — включение/выключение субтитров;
- a — переключение места отображения субтитров (наверху, посередине, внизу);
- x и z — подстройка синхронизации субтитров (шаг в 0,1 секунды);
- o — включение/выключение On-Screen Display (строки с временем воспроизведения и т.д.).
-
Популярные в этом разделе:
- «Обзор системы фильтрации спама rspamd: возможности, конфигурация, работа»,
- «Защищаем себя средствами GnuPG»,
- «Своё интернет-радио с Icecast».
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Скажите пожалуйста, как мне скачать аудиопоток из сети и его сконвертировать в нужный формат?
Речь о сетевом радио. Команда прекрасно сохраняет в файл
mplayer.exe mms://195.190.97.147:8080 -dumpstream -dumpfile out.wma
а как мне сохранить этот файл в качестве mp3 64 кбит/с, моно? Манипуляции с Mencoder ни к чему не привели.
Помогите пожалуйста
Ну почему же не помнят? Помнят. Вот, например, классная утилита soma использующая MPlayer. Те кто слушает радио, предпочитают терминал.