Окончание, начало см. в МК № 20 (243)
Все это, конечно, хорошо, но размеры файлов получаются иногда ужасающими; желательно немножечко сжать получившийся результат. На то есть инструменты. Например, lav2mpeg, позволяющая преобразовать lav-файлы или поток в MPEG. В качестве входной информации может выступать любая комбинация AVI (.avi), Movtar (.movtar), Quicktime (.qt/.mov) или editlist-файлов:
[sergej@grinder work]$ lav2mpeg -a 160 -b 2110 -d 320x240 -m mpeg1 -o output.mpg editlist
В результате получим на выходе MPEG1-файл output.mpg, полученный из инструкций в editlist, с видеобитрейтом 2110 Кбит/c и аудиобитрейтом 160 Кбит/c, размером 320240 пикселей.
Или чтобы создать MPEG2 из предварительно созданного file.avi:
[sergej@grinder work]$ lav2mpeg -o mpeg2 -O output.mpg file.avi
В процессе своей работы данная утилита считывает конфигурационный файл ~/.lav2mpegrc, в котором можно установить опции по умолчанию, чтобы не задавать их каждый раз в командной строке.
Далее создаем звук. В MPEG1-видео в качестве звука используют файлы MPEG1-layer2; для MPEG2-видео можно использовать MPEG1-layer2 и MPEG1-layer3 (.mp3). MP3 — неофициальный аудиоформат: хотя большинство VCD-проигрывателей поддерживают его, для видеодисков он недопустим. Для кодирования в MPEG1-layer2 применяется утилита mp2enc. Если все же потребуется MP3, то подставьте в пример соответствующий кодер (например, lame).
[sergej@grinder work]$ lav2wav file.avi | mp2enc -o sound.mp2
Получим звуковой файл sound.mp2 с битрейтом по умолчанию 224 Кбит/c, или обычный вавчик:
[sergej@grinder work]$ cat sound.wav | mp2enc -v 2 -o sound.mp2
Параметр -v 2 добавлен для информативности. MPEG1 официально не поддерживает VBR (Variable Bit Rate), но если действительно нужен такой файл, то попробуйте установить параметр -b очень большим (2500) — говорят, иногда работает. Протестировать полученный файл можно с помощью чуть не любого проигрывателя, например, plaympeg sound.mp2 или mpg123 sound.mp2.
Конвертировать в форматы MPEG 1/2 можно и при помощи утилиты mpeg2enc, имеющей впечатляющее количество опций:
[sergej@grinder work]$ lav2yuv video.avi video1.avi | mpeg2enc -o video.m1v
При этом на выходе получится видеофайл с битрейтом по умолчанию 1152 Кбит/c, что оптимально при создании VCDS. При необходимости определить большое количество файлов можно использовать и шаблон, например, %nd, где n — номер:
[sergej@grinder work]$ lav2yuv video%02d.avi | mpeg2enc -b 1500 -r 24 -o video.m1v
Получится видеофайл с битрейтом 1500 Кбит/с. Опция -r--motion-search-radius устанавливает поисковый радиус 24 (16 по умолчанию, 16 и 24 оптимально). В двух словах, насколько далеко будут просматриваться смежные сектора и кадры. Значения (0, 8), улучшают скорость кодирования, но получается более низкое качество, в то время как при более высоком значении (24, 32, …) улучшается качество ценой скорости.
Утилита yuvscaler дополнительно позволяет автоматически подгонять (масштабировать) полученное изображение под формат, требуемый спецификациями, например, для записи VCD:
[sergej@grinder work]$ lav2yuv stream.avi | yuvscaler -O VCD | mpeg2enc -o video.m1v
На выходе получим файл, подогнанный под размер VCD, т.е. для PAL/SECAM 352288 и NTSC 352240 и закодированный как MPEG1-поток.
Для SVCD все масштабируется к 480480 NTSC или 480576 PAL/SECAM:
[sergej@grinder work]$ lav2yuv stream.avi | yuvscaler -O SVCD -M BICUBIC | mpeg2enc -o video.m1v
-М указывает на высококачественный bicubic-алгоритм Mitchell-Netravalli — что за алгоритм такой, если честно, не разобрал, но рекомендуется, вроде как действительно ничего. Для установки видеорежима 16:9 и SVCD можно применить такую комбинацию: yuvscaler -M WIDE2STD -O SVCD. При помощи флагов -I и -О с соответствующими опциями можно отобрать только нужную часть кадра, остальное же будет черным (-I USE_450x340+20+30 -O SIZE_320x200). Теперь командой plaympeg video.m1v можно проверить результат.
На данном этапе имеем отдельно подготовленные MPEG видео- и звуковой файлы в выбранном в формате. Теперь осталось слить их в один файл. Здесь на помощь придет утилита mplex, позволяющая соединить один или большее количество MPEG-1/2 потоков видео, MPEG layer-II/III, AC3- и MPEG(5.1)-аудиопотоки в единственный поток программы. На выходе в зависимости от выбранных опций можно получить файл в формате VCD или SVCD, который, используя специальные средства записи типа vcdimager (http://www.vcdimager.org) или любую другую программу, предназначенную для этой цели, например пакет cdrtools, можно слить на болванку и запустить в любом, в том числе и бытовом проигрывателе. Для записи DVD (а почему бы и нет) удобнее будет воспользоваться утилитой Dvdauthor (http://dvdauthor.sourceforge.net), или посмотрите на +RW. Дополнительно можно разбить выходной поток на части указанного размера.
[sergej@grinder work]$ mplex sound.mp2 video.m1v -o my_video.m1v
Все, можно смотреть на любом проигрывателе. При помощи опции -S для mpeg2enc mplex автоматически разобьет файлы и подаст их на выход с названием, согласуясь с опциями printf (например, mpeg2enc-S 650 и mplex -o test%d.mpg), при этом каждая часть будет корректно закрыта. Возможно кодирование с VBR, что только повысит эффективность такого процесса, но при условии, если mpeg2enc также запускалась с этим параметром. При этом утилите необходимо собственноручно указать максимальный битрейт, т.к. она не может определить ее автоматически. Он высчитывается по такой формуле: скорость аудио + максимальная при videobitrate + 1(2)%, т.е. если аудио (-b 224) имеет 224 Кбит/c, а видео имеет 1500 Кбит/c (было закодировано с -b 1500 -q 9), тогда на выходе имеем 17241.01 или приблизительно 1740 Кбит/c:
[sergej@grinder work]$ mplex -V -r 1740 audio.mp2 video_vbr.m1v -o vbr_stream.mpg
Видеодиск, конечно, хорошая вещь, но миром правит DivX. Конечно же, нашелся инструмент (даже два), позволяющие закодировать поток и в этом формате —yuv2divx и lav2divx, правда, первая имеет больше опций и, соответственно, возможностей.
Простейший случай будет таким:
[sergej@grinder work]$ lav2yuv stream.avi | yuv2divx -A stream.avi -o lowrate.avi
При кодировании используются библиотеки утилиты avifile (http://avifile.sourceforge.net) — о ней поговорим в одной из следующих статей — и, соответственно, зависит от поддерживаемых последней кодеков. При этом не требуется мультиплексирование, чтобы предварительно объединять аудио и видео. Звук может быть уже в конвертируемом файле или добавляться отдельно при помощи опции -A (это либо .wav(PCM)-файл либо файл, читаемый из любой lav-утитилиты), при этом вполне работоспособен и вариант, представленный в примере (происходит считывание из видеофайла — опция -A stream.avi):
[sergej@grinder work]$ lav2yuv stream.avi | yuvdenoise | yuvscaler -O SIZE_640x480 | yuv2divx -b 2500 -a 196 -E DIV5 -A stream.avi -o output.avi
А вот и боевой примерчик. Здесь мы устанавливаем максимальный битрейт выходных видеоданных в 2500 Кбит/c, аудиобитрейт в 192 Кбит/c, и видеокодек — DIV5. И кстати, DivX показывает звук и картинку в хорошем качестве при более низком видеобитрейте, чем у MPEG2, поэтому можно обойтись и меньшими значениями оного.
Если нет необходимости во всех этих преобразованиях, фильтрах и прочих наворотах, то закодировать можно и сразу:
[sergej@grinder work]$ lav2divx -b 1000 -E DIV5 -o output.avi editlist
Дальше займемся утилитами оптимизации потока.
Фильтры,. имеющиеся в комплекте, позволяют улучшить качество изображения, убрав некоторые артефакты, шумы, и при этом еще и уменьшить размер выходного файла. Сигнал должен поступать на stdin, выходить в stout, т.е. общий формат такой:
filter_name [options] /dev/stdout
при этом получившийся результат не может быть сохранен в файле, а должен быть подан на вход следующей программы.
Фильтр yuvmedianfilter оценивает среднее значение вокруг некоторой точки, и в результате работы всяких там алгоритмов изображение получается немного более мягким, а грани более отчетливыми:
[sergej@grinder work]$ lav2yuv stream.avi | yuvmedianfilter | mpeg2enc -o video.m1v
Можно указать при помощи флага -r другой радиус осмотра (более 2 (параметр по умолчанию, 0 — параметр отключен), но работает очень медленно) и порог срабатывания триггера -t (по умолчанию 2), T.е. порог фильтрации цветовой насыщенности иногда приводит к «озеленению» цвета, поэтому придется отключать -T 0.
[sergej@grinder work]$ lav2yuv stream.avi | yuvmedianfilter -r 3 -t 4 -T 0 | mpeg2enc -o video.m1v
Фильтр yuvdenoise убирает шум, сравнивая предыдущий и последующий кадры, главным образом им уменьшается плотность цвета, шум яркости и мерцание фазовых искажений, но также эффективен он и при удалении зернистости. В man yuvdenoise даны рекомендации по получению лучшего результата. Согласно этому описанию, результирующая строка должна выглядеть приблизительно так:
[sergej@grinder work]$ lav2yuv movie.avi | yuvdenoise -b 8,64,-8,-64 | yuvscaler -O SIZE_352x288 | mpeg2enc -f 1 -o movie.m1v
Фильтр yuvkineco предназначен для улучшения качества NTSC-сигнала, у нас используемого редко. Аналогично фильтр yuvycsnoise также оптимизирован для работы с системой NTSC, и позволяет уменьшить шум в файлах, закодированных в этой системе. Если хотите знать, как каждый фильтр понижает битрейт, посмотрите таблицу. При этом использовался оригинальный файл с качеством 5 и начальным битрейтом 8500 Кбит/c.
Опция mpeg2enc --keep-hf позволяет сохранить максимальное качество, хотя последнее в первую очередь зависит от оригинала.
Иногда требуется подкорректировать размер — как это сделать, мы уже в общих чертах рассматривали:
[sergej@grinder work]$ lav2yuv editlist | yuvscaler -I USE_400x400+50+100 | yuvplay
Здесь мы только принимаем изображение и масштабируем его до нужного размера кадра. Но yuvscaler также изменяет формат изображения пиксела, тем самым корректируя типовой формат изображения.
Для центровки по горизонтали применяется утилита y4mshift:
[sergej@grinder work]$ lav2yuv editlist | y4mshift -n 20 | mpeg2enc -f 3 -b 4000 -q 10 -o video.m2
При этом изображение сдвинется на 20 пикселов вправо, а если иметь отрицательное число — влево. При этом число должно быть четным; вставленные пикселы будут иметь черный цвет.
Иногда необходимо конвертировать количество кадров framerate, например при преобразовании из PAL в NTSC. В этом поможет yuvfps, которая понижает framerate, пропуская кадры, или повышает его, копируя кадры.
Поскольку кадры только копируются (удаляются), поначалу необходимо их очистить от шума и подогнать по масштабу.
sergej@grinder work]$ lav2yuv editlist | yuvdenoise -F | yuvfps -r 30000:1001 | yuvscaler -O SVCD | mpeg2enc -f 4 -o video_ntsc_svcd.m2v
В этом примере конвертируется исходное видео к NTSC, функционирующему с 30000:1001 FPS (или 29.97 FPS) в формате SVCD.
Далее вкратце о паре дополняющих утилит, которые необходимо установить отдельно.
Чтобы связать некоторые утилиты с интерфейсом ImageMagick'a, можно воспользоваться программой yuvmagick, которую можно найти на .
И наконец, по адресу , доступна утилита y4mscaler, позволяющая масштабировать, обрезать и сдвигать видеопотоки; дополнительно с ее помощью можно мимоходом подкорректировать цветовую насыщенность. Например, берем центр 100100 NTSC-DV потока, окружаем синей декоративной рамкой в 20 пикселов и переводим до полноэкранного SuperVCD-потока:
y4mscaler -I active=140x140+0+0cc -I matte=100x100+0+0cc -I bg=RGB:0,0,255 -O preset=svcd
И еще одна родственная утилита dv2jpg (), позволяющая перекодировать DV-кодированный AVI-поток (из dvgrab, например) в jpeg-кодированный, который может быть обработан mjpeg-пакетом или просто записан на VCD.
На этом, пожалуй, и остановимся. Последний сюрприз я оставил под конец. Дело в том, что такой мощный пакет как mjpegtools в архиве занимает чуть меньше 2 Мб. Так что выбирайте: либо красивая программа в Windows, потребляющая много ресурсов только на прорисовку самой себя и стоящую тысячи, либо совсем маленькая, но бесплатная и очень быстрая в Linux.
Linux forever!

