воскресенье, 6 января 2008 г.

Дейтвительно краткое введение в mencoder

- Храните ваше видео пожатым.
(с) так и оставшийся неизвестным режиссёр
Преамбула, или вводная часть.

Скопилось у меня дома порядочное количество видео, снятое фотоаппаратом. Проблема заключалась в том, что видео было пожато кодеком mjpeg (ну или как там его), смысл которого заключается в том, что каждый кадр это обычный JPEG, что разумеется плохо сказывается на размере файла. Формат звукового потока тоже не радовал - обычный, не пожатый PCM. Клипов накопилось гигабайт так на 3-4, нужно было что-то делать.

Разумеется есть хорошая программа VirtualDubMod, с которой я уже работал. Но проблема заключалась ещё и большом количестве файлов. VirtualDubMod вроде как предлагает какие-то возможности пакетной обработки, но я решил изучить mencoder, который как известно является утилитой коммандной строки. Возможности пакетной обработки так и просятся в руки.
Ещё одним плюсом была возможность использовать mencoder в Windows(на работе) и в Linux(дома).

Сейчас я расскажу пару вещей, которые как мне кажется являются основами основ мироздания и mencoder-а.

Собственно амбула, или содержательная часть.

Что же нужно задать, что бы сконвертировать видео ?
1. Источник данных
2. Фильтры обработки (ресайз, кроп, подавление шума)
3. Кодек для сжатия звука.
4. Опции сжатия звука.
5. Кодек для сжатия видео.
6. Настройки сжатия видео.
7. Параметры выходного файла (имя, fourcc код)
Немного кофе/чая не помешает.

Теперь немного подробнее обо всех пунктах.

1. Нужно указать источник видео потока, который мы хотим конвертировать. Задаётся так-же как и в mplayer.
Пару простых примеров:
$ mencoder source.avi # avi файл на вход
$ mencoder dvd://1 # первый тайтл DVD на вход
$ mencoder dvd://1 -chapter 3 # первый тайтл, 3-ий чаптер DVD на вход (хм, как же тайтл и чаптер на русский переводятся ?)
$ mencoder dvd://1 -dvd-device /home/pupkin42/from_sidoroff/futurama # первый тайтл DVD на вход с указанием DVD устройства (тут просто директории с копией DVD)
так-же можно задать и другие источники - потоковое видео из сети, с TV-тюнера, DVB карты и т.д. Подробности в man

2. Можно задать различные фильтры, например для ресайза, кропинга, удаления шумов и т.д.
Подробности не привожу. По началу они не нужны, а потом можно посмотреть в man. Изучение можно начать с опции -vf cropdetect

3. Задаём кодек для сжатия аудио потока:
$ mencoder ... -oac mp3lame
-oac видимо означает output audio codec
Mencoder может кодировать звук несколькими кодеками. Один из них псевдокодек - copy. Он просто копирует входной поток в выходной, не производя никаких разжатий-сжатий.
Полезен в случае, если имеющееся аудиодорожка уже сжата как надо. Процессор при этом почти не используется.

4. Задаём опции для аудио кодека
$ mencoder ... -lameopts cbr:br=96:mode=1
тут после -lameopts идут опции кодека. Для другого кодека ключ будет другим. (Что-то вроде -anotercodecopts)
cbr означает константный битрейт
br=96 - битрейт в 96 килобит в секунду,
mode=1 - режим стерео joint

5. Задаём видеокодек.
$ mencoder -ovc lavc
(кодек lavc сокращённо от libavcodec)
Так же как и в случае с аудиокодеками, видеокодеков несколько. lavc - один из них.

6. Самое главное. Задаём настройки кодека. Для lavc кодека это будут значения ключа -lavcopts
$ mencoder ... -lavcopts vcodec=mpeg4:vbitrate=5000
vcodec - задаём формат выходного видеопотока. libavcodec может сжимать в разные форматы. В данном случае выбираем mpeg4
vbitrate=5000 - битрейт выходного потока. Тут я объяснять не буду, тема отдельной статьи. Но скажу, что это число всего-лишь верхний потолок. Если кодеку нечего будет жать, то он уменьшит битрейт. Так что указав, например, 10000, можно ожидать, что видео будет пожато в наилучшем виде, и при реальный битрейт может быть например 2000.
Обычно битрейт фильмов где-то на уровне 900-1500.
Ещё можно добавить следующие опции(что они делают я не в курсе, но все советуют и я буду)
-lavcopts vcodec=mpeg4:vbitrate=5000:mbd=2:v4mv:trell

7. Укажем имя выходного файла
$ mencoder ... -o output.avi
Так же для того, что бы некоторые плееры не ругались на неизвестный формат, можно указать FOURCC код выходнорго потока как DIVX
$ mencoder ... -ffourcc DIVX

8. Собираем все опции в одну строку и получаем что-то вроде:
$ mencoder dvd://1 -dvd-device /home/simpsons
-oac mp3lame -lameopts cbr:br=96:mode=1
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=800:mbd=2:v4mv:trell
-o simpsons-001.avi
-ffourcc DIVX

Пару слов о многопроходных конвертированиях.
Добавив к опциям кодека опцию vpass=1 (для первого прохода) и vpass=2(для второго) можно улучшить качество картинки, за счёт того, что кодек будет лучше знать где стоит пустить больший поток, а где поменьше. Тот-же пример с симпсонами:

$ mencoder dvd://1 -dvd-device /home/simpsons
-oac copy
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=800:mbd=2:v4mv:trell:vpass=1
-o /dev/null
В первом проходе аудио не конвертируем. Сделаем это в последнем проходе.
Получающийся файл нам не нужен - отправляем его в /dev/null (в Windows -o NUL)
mencoder создаст файл divx2pass.log, в который запишет информацию о каждом кадре.

$ mencoder dvd://1 -dvd-device /home/simpsons
-oac mp3lame -lameopts cbr:br=96:mode=1
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=800:mbd=2:v4mv:trell:vpass=2
-o simpsons-001.avi
-ffourcc DIVX
Во втором проходе mencoder анализирует log файл и более оптимально перераспределяет видео поток в рамках выделенного битрейта.
Аудио разумеется нам нужно, выходной файл тоже. Дополнительно установим FOURCC код в DIVX, что-бы не было проблем.

Как можно заметить, кодирование с vpass=N не отличается от обычного кодирования, за исключением одной простой штуки:
vpass=1 заставит кодек записать log файл
vpass=2 говорит кодеку прочитать log файл, и использовать данные из него
vpass=3 и читает и пишет лог одновременно, ещё более его облагораживая.
Таким образом легко догадаться, что для многопроходной конвертации нужно сделать проходы с vpass=1, vpass=3, ... vpass=3, vpass=2

Хочу предостеречь от паралельного запуска нескольких многопроходных конвертаций в одной рабочей директории. Кодек обязательно запутается где чей log файл. В результате будет создан неверный выходной файл. Я напоролся на это, решив помочь серверу конвертировать симпсонов своим ноутбуком, и запустил конвертацию другого DVD но в той-же директории. В результате пол дня работы вылетело в трубу, пришлось всё пережимать.

Конец всех амбул, или проще говоря эпилог.
mencoder имеет громадное количество опций, и разобратся в них с наскоку очень сложно. Надеюсь моя статья немного поможет быть "в теме"

P.S. Кстати о симпсонах. Я их таки сконвертил, все 4 диска по 26 серий на каждой. В линуксе это выглядит так:
for dvd in simpsons1 simpsons simpsons3 simpsons4; do
for title in $(seq 1 100); do
mencoder -dvd-device $dvd dvd://$
title -o $dvd-$title.avi (... параметры конвертации ...)
# второй проход и прочая работа
done
done
Проще говоря конвертируем все все копии 4-ёх DVD-шек, в каждой тайтлы от 1 до 100. На дисках их было по 25-26, и оставшиеся 27-100 просто отваливались с ошибкой, не создавая выходного файла, что меня вполне устраивало. Каждый тайтл - один мультфильм.