Нашел старую статью, проверил пару параметров вроде бьет, поэтому оставляю пока as is.
Первоначально Linux использовалась в основном программистами и в качестве серверной операционной системы, этим наверное и сказалось на том наборе программ который сопровождал данную систему в первые годы ее развития. В последнее же время наметилась тенденция к применению данной ОС в практически любой сфере где может работать компьютер, что несомненно сразу же сказалось на ассортименте программного обеспечения. Об одном из пакетов программ, с помощью которого можно осуществлять запись, простой монтаж, воспроизведение и компрессию аудио и видео под этой платформой и пойдет речь в данной статье.
И так пакет носит довольно нехитрое название mjpegtools, найти в Интернете можно по адресу http://mjpeg.sourceforge.net/. На сайте проекта доступна некоторая документация (особенно рекомендую почитать MJPEG Howto), а также ссылки на некоторые другие интересные и в большинстве своем дополняющие проекты. Для компиляции понадобятся программы и библиотеки quicktime4linux (рекомендуется компилировать с опциями ./configure —use-dv —use-firewire), jpeg-mmx и libmovtar. Собственно сам пакет состоит из 30 утилит каждая из которых занимается одним определенным заданием. Мне кажется, что такой подход намного проще, чем создание одной, но полнофункциональной, так например, развитие каждой идет независимо от других, да и большинство опций в утилитах имеют тождественное значение, что существенно облегчает их изучение. Общим для большинства представленных ниже утилит будет то, что они имеют опции для создания результирующего файла, а вот данные для своей работы получают со стандартного входа (stdin), так что сильно не ищите. С помощью каналов (pipes) все их можно соединить в практически любой комбинации, которую душа пожелает, правда чтобы такое соединение имело хоть какой то смысл. Хотя прежде всего mjpegtools предназначена для использования с устройствами захвата базирующимися на кодеке Zoran ZR36067 MJPEG, все утилиты без проблем могут использоваться, чтобы обрабатывать и сжимать MJPEG потоки, снятые с любой из video4linux программ например с помощью таких как xawtv или broadcast 2000.
Я не буду касаться подробностей различных форматов, но если чувствуете, что надо что-то почитать зайдите на страничку http://www.mir.com/DMG, где найдете некоторые инструкции по записи видео и описание различий форматов видео. Еще хочу добавить, что практически все программы за исключением разве что предназначенной непосредственно для захвата не критичны к системным ресурсам, хотя как вы должны понимать в данном вопросе все же чем больше, тем быстрее.
Запись (захват) видео осуществляется при помощи утилиты lavrec. По умолчанию она в качестве входного видео устройства использует /dev/video, звук — /dev/dsp и миксер /dev/mixer. Но с помощью соответствующих переменных LAV_VIDEO_DEV, LAV_AUDIO_DEV и LAV_MIXER_DEV можно все это переопределить.
Запустить на запись утилиту можно с помощью примерно такой команды
[sergej@grinder work]$ lavrec -f a -i S -d 2 record.avi
Опция -f позволяет указать формат выходного файла в данном случае это AVI (q — Quicktime, m — Movtar), но по умолчанию умная утилита смотрит на расширение файла (*.avi, *.qt, *.movtar) и принимает решение о формате сама, но наверное лучше подстраховаться. С помощью -i S задан формат входного сигнала SECAM через SVHS, чтобы уменьшить размер изображения в два раза (и выходного файла) использована опция -d, при необходимости изменить размер по горизонтали и вертикали индивидуально необходимые пропорции можно указать с помощью двух цифр -d 12. При необходимости вместо имени выходного файла можно воспользоваться шаблоном, например file%02d.avi создаст файлы file00.avi, file01.avi и т.д, таким путем можно спокойно обойти максимальный размер файла в используемой файловой системе и программа в этом случае остановится когда диск заполнится полностью. По умолчанию записывается текущий канал xawtv, но с помощью -C его можно изменить, при этом применяется описание в стиле xawtv т.е. -C europe-west:SE27. Соотношение качество/размер выходного файла устанавливается при помощи -q # (где # число в промежутке 0 … 100, по умолчанию 50). Кстати подбирая различные варианты опций d и q можно добиться вполне приличного качества при меньшем размере выходного файла.
Но это еще не все способы получить видео. С помощью утилиты jpeg2yuv можно все картинки в формате jpeg собрать в единый видеофайл. Например, такая команда
[sergej@grinder work]$ jpeg2yuv -f 25 -j picture_%06d.jpg > result.yuv
создаст файл result.yuv содержащий видеоинформацию с 25 FPS, которая устанавливается с помощью опции -f. Шаблоны для файлов можно задавать в стиле C точнее printf, подробности в цикле статей Тихона Тарнавского. Используя каналы можно сразу создать mpeg файл, не затрачивая ресурсов на создание промежуточного.
[sergej@grinder work]$ jpeg2yuv -f 25 -j picture_*.jpg | mpeg2enc -o mpegfile.m1v
Номер изображения с которого нужно начать запись и их количество устанавливаются при помощи опций -b и -n. Вот так можно собрать все файлы начиная с image3.jpg, количеством 50.
[sergej@grinder work]$ jpeg2yuv -b 3 -f 25 -n 50 -j image*.jpg | yuv2lav -o without_sound.avi
А следующим ходом добавляем звук.
[sergej@grinder work]$ lavaddwav without_sound.avi sound.wav with_sound.avi
Я себе таким образом уже альбомчик забацал.
При помощи другой утилиты ppmtoy4m можно аналогичным образом записать в видео файлы в формате ppm. При этом размер выходного кадра определяется по первому файлу.
[sergej@grinder work]$ cat *.ppm | ppmtoy4m -o 10 -n 60 -F 25:1 | mpeg2enc -o output.m1v
При помощи команды cat направляем все ppm файлы на вход ppmtoy4m, где пропускаются первые десять кадров и сохраняются последующие 60, опция -F устанавливают скорость передачи кадров, для PAL/SECAM устанавливается 25:1.
Можно создать видеопоток из одного файла, например для заставки.
[sergej@grinder work]$ ppmtoy4m -n 15 -r image.ppm | mpeg2enc -o output.m1v
При этом будет в поток рекурсивно выводится файл image.ppm, а опция -n указывает на количество проходов.
Если по рукой как назло нет файлов в данном формате, то на выручку прийдет утилита convert из пакета ImageMagick.
[sergej@grinder work]$ convert *.jpg ppm:- | ppmtoy4m | yuvplay
С помощью такой вот не хитрой конструкции конвертируются все jpg-файлы, конвертируются и результат просматриваться в видео. В пакете существует и обратная утилита y4mtoppm и сигнал с них можно передавать друг другу, правда качество при этом теряется по сравнению с оригиналом, но откусить некоторое количество кадров и преобразовать их в ppm вполне возможно, в приведенном ниже примере — 15 первых.
[sergej@grinder work]$ lav2yuv -f 15 video.avi | y4mtoppm | pnmsplit — «video-%d.ppm
Понемногу дошли и до программ для оценки (воспроизведения) полученного результата. Для этого используются две утилиты lavplay или glav (вторая фронт-енд к первой).
[sergej@grinder work]$ lavplay -p S record.avi
И увидим изображение и услышим звук. В данном примере декодирование файла полностью ляжет на плечи центрального процессора, при помощи —p Н данную задачу можно переложить на аппаратные средства, есть еще флаг C включающий выход TV, но к превеликому сожалению последние два флага работают только с чипами Zoran, поэтому прийдется в большинстве своем использовать мощь ЦП. Соответственно при помощи -Z, -z и —size NxN можно задать полноэкранный вывод, zoom или установить размер экрана. Для запуска GUI режима есть опция —g/—gui-mode, которая просто запускает glav.
С помощью glav дополнительно можно под редактировать получившийся файл. Опций немного, возможно только удаление частей, вырезка, вставка копий видеофрагментов. Точнее было бы сказать не отредактировать, а разметить потому что оригинал остается не тронутым. С помощью кнопок Select Start и Select End, выделяется фрагмент файла и назначается действие далее при выходе необходимо записать все в обычный текстовый файл (далее чтобы не повторятся подобный файл будет называться editlist) с помощью Save All и вскормить этот файл утилитам lav2wav, lav2yuv, lavtrans которые и производят деструктивные действия. Поэтому если необходимо разбить записанное видео на несколько меньших частей, просто отмечают части и затем сохраняют каждую часть в различные файлы. После этого вводим приметно такую команду.
[sergej@grinder work]$ lavtrans -o final_version.avi -f a editlist
где с помощью опции -о указывается конечный файл, а editlist имя сохраненного с помощью «save all» или «save select» файла в glav, а опция -f a по-прежнему указывает на выходной формат в данном случае AVI. Утилита lavtrans позволяет объединить несколько файлов в один, при этом при необходимости можно переконвертировать в нужный формат. Вот так.
[sergej@grinder work]$ lavtrans -o final_file.qt -f q record_1.avi record_2.avi … record_n.avi
Иногда нужно выделить звук из видео фрагмента, например для звукового оформления системных событий, конвертировать в другой формат или просто чтобы удалить шум. Это можно проделать аж двумя способами. Первый при помощи опции -f с флагом w, указывающим на звуковой файл в качестве выходного.
[sergej@grinder work]$ lavtrans -o sound.wav -f w file.avi
Или на помощь может прийти отдельная специально обученная утилита lav2wav, которая по умолчанию выдает сигнал в stdout, что позволяет без остановки закодировать его тем же lame, но может быть сохранен и в файле.
[sergej@grinder work]$ lav2wav file.avi | lame — audio.mp3
Но кстати работает и такая конструкция использующая файл полученный при помощи glav, позволяющая избежать лишних действий.
[sergej@grinder work]$ lav2wav editlist > sound.wav
А вот например попала в руки пиратская копия фильма «Матрица -2» и хочется разложить его по кадрам, чтобы себе обои на рабочем столе застелить. Та пожалуйста. Сказано сделано.
[sergej@grinder work]$ mkdir jpg; lavtrans -o jpg/image%05d.jpg -f i matrix_2.avi
И теперь в созданном подкаталоге jpg будет создано великое множество графических файлов от image00000.jpg до imageххххх.jpg. Выбирай нехочу.
При необходимости выделить всего один кадр можно применить и вот такую конструкцию.
[sergej@grinder work]$ lav2yuv -f 15 Matrix_2.avi | y4mtoppm -L > wallpaper.pnm
Теперь кадр номер 15 перекочует в файл wallpaper.pnm.
А вот утилита lavpipe делает возможным создавать простые переходы между фильмами или комбинировать уровни.
Например имеется два видео файла intro.avi и epilogue.mov и мы хотим сделать intro.avi переход в epilogue.mov с продолжительностью одной секунды (который является 25 кадрами для PAL или 30 кадров для NTSC). При этом intro.avi и epiloque.mov должны иметь тот же самый формат (точнее одинаковые скорость передачи кадров и разрешающая способность). Например два файла с разрешением 352×288 системы PAL, содержат: intro.avi — 250 кадров, и epilogue.mov — 1000 кадров долго. Таким образом выходной файл будет содержать: первые 225 кадров intro.avi, 25 кадров перехода, которые содержат последние 25 кадров intro.avi и первых 25 кадров epilogue.mov и далее 975 оставшиеся кадров epilogue.mov. Получить последних 25 кадров intro.avi можно например так.
[sergej@grinder work]$ lav2yuv -o 225 -f 25 intro.avi
Опция -o 255, указывает lav2yuv на смещение от начала на 225 кадро, а -f 25 выбирает из потока ровно 25 кадров. Но этот вариант хорош когда известно количество этих самых кадров, а кто их считает вообще. Поэтому удобнее будет такой вариант.
[sergej@grinder work]$ lav2yuv -o -25 intro.avi
То есть используем негативное смещение с конца файла.
Первые 25 кадров epilogue.mov (по умолчанию -о 0 т.е. смещение от начала 0 кадров):
[sergej@grinder work]$ lav2yuv -f 25 epilogue.mov
Далее соединяем при помощи lavpipe два потока.
[sergej@grinder work]$ lavpipe «lav2yuv -o -25 intro.avi» «lav2yuv -f 25 epilogue.mov»
Результатом будет поток который можно направить в другую утилиту transist.flt.
Программа transist.flt должна иметь информацию относительно продолжительности перехода и прозрачности второго потока в начале и конце перехода. Для этого в нашем случае используем следующие флаги: -о [0-255] указывающий на непрозрачность второго потока с начала (0 — поток полностью прозрачен, 255 — полностью непрозрачен), -О [0-255] непрозрачность второго потока с конца и -d num продолжительность перехода в кадрах.
В нашем случае правильный запрос при переходе от потока 1 к потоку 2 выглядит так.
[sergej@grinder work]$ transist.flt -o 0 -O 255 -d 25
Опции -s и -n утилиты transist.flt по своему значению эквивалентны соответственно параметрам -o и -f lav2yuv и необходимы когда надо выполнить часть перехода. Далее полученный поток сжимаем при помощи yuv2lav.
[sergej@grinder work]$ yuv2lav -f a -q 80 -o transition.avi
т.е. читаем yuv поток от stdin и на выходе получаем avi файл (-f a) с сжатием jpeg качества 80. Вот теперь мы имеем целую команду для создания перехода:
[sergej@grinder work]$ lavpipe «lav2yuv -o -25 intro.avi» «lav2yuv -f 25 epilogue.mov» | transist.flt -o 0 -O 255 -d 25 | yuv2lav -f a -q 80 -o transition.avi
Результат может быть оформлен как LAV Edit List, который можно использовать с утилитами glav или lavplay или непосредственно с mpeg2enc с lav2yuv или объединить все в один mjpeg файл с lavtrans или комбинацией lav2yuv|yuv2lav.
Все вышеописанное конечно хорошо, но размеры получаются иногда ужасающими поэтому желательно немножечко сжать получившийся результат. В этом случае имеются необходимые инструменты. Ниже рассмотрим способы получения файлов в формате MPEG или DIVx. Например lav2mpeg позволяющая преобразовать lav файлы или поток к mpeg. Входная информация может быть любая комбинация AVI (.avi), Movtar (.movtar), Quicktime (.qt/.mov) или editlist файлов.
[sergej@grinder work]$ lav2mpeg -a 160 -b 2110 -d 320×240 -m mpeg1 -o output.mpg editlist
В результате получим на выходе mpeg1 файл output.mpg, полученный из инструкций в editlist, с видеобитрейтом 2110kBit/sec и аудиобитрейтом 160 kBit/sec, с разрешающей способности 320×240.
Или чтобы создать mpeg2 из предварительно созданого file.avi.
[sergej@grinder work]$ lav2mpeg -o mpeg2 -O output.mpg file.avi
В процессе своей работы данная утилита считывает конфигурационный файл ~/.lav2mpegrc в котором можно установить опции по умолчанию и не задавать их каждый раз в командной строке.
Далее создаем звук. MPEG-1 видео в качестве звука используют файлы MPEG1-layer2, для MPEG-2 видео можно использовать MPEG1-layer2 и MPEG1-layer3 (MP3). Формат MP3 не официальный аудиоформат, хотя большинство VCD проигрывателей поддерживают его, но для видеодисков он недопустим. Для кодирования в MPEG1-layer2 применяется утилита mp2enc. Если все же потребуется mp3 то подставте в пример соответсвующий кодер (например lame cм. выше).
[sergej@grinder work]$ lav2wav file.avi | mp2enc -o sound.mp2
Получим звуковой файл sound.mp2 с битрейтом по умолчанию 224kBit/sec. Или обычный вавчик.
[sergej@grinder work]$ cat sound.wav | mp2enc -v 2 -o sound.mp2
Параметр -v 2 добавлен для информативности. MPEG1 оициально не поддерживает VBR (переменная скорость кодирования), но если действительно нужен такой файл, то попробуйте установить параметр -b очень большим (2500) говорят иногда работает. Протестировать полученный файл можно с помощью практически любого проигрывателя, например plaympeg sound.mp2 или mpg123 sound.mp2.
Конвертировать в форматы MPEG 1/2 можно и при помощи утилиты mpeg2enc имеющей довольно приличное количество опций.
[sergej@grinder work]$ lav2yuv video.avi video1.avi | mpeg2enc -o video.m1v
При этом на выходе получится видеофайл видео с битрейтом по умолчанию 1152kBit/sec, который является оптимальным при создании VCDS. При необходимости определить большое количество файлов можно использовать и шаблон, например %nd, где n номер.
[sergej@grinder work]$ lav2yuv video%02d.avi | mpeg2enc -b 1500 -r 24 -o video.m1v
Получится видеофайл с битрейтом 1500kBit/s. Опция -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 352×288 и NTSC 352×240 и закодированный как MPEG1 поток.
Для SVCD, масштабируется к 480×480 NTSC или 480×576 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/) . Дополнительно можно разбить выходной поток на части указанного размера.
[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) имеет 224kBit, видео имеет 1500kBit (было закодировано с -b 1500 -q 9) тогда на выходе имеем 1724 * 1.01 или приблизительно 1740kBit.
[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
А вот и боевой примерчик. Здесь мы устанавливаем максимальную битрейт выходных видеоданных в 2500kBit/s и аудиобитрейт 192kBit/s и видеокодек — DIV5. И кстати Divx показывает лучшее качество при более низком видеобитрейте чем у MPEG2 поэтому можно обойтись и меньшими значениями оного.
Ну и если нет необходимости во всех этих преобразованиях, фильтрах и прочих наворотах, то закодировать можно и сразу.
[sergej@grinder work]$ lav2divx -b 1000 -E DIV5 -o output.avi editlist
Дальше займемся утилитами оптимизации потока.
Фильтры имеющиеся в комплекте позволяют улучшить качество изображения, убрав некоторые артефакты, шумы и при этом еще и уменьшить размер выходного файла. Сигнал должен поступать на stdin выходит в stout, т.е. общий формат такой
filter_name [options] </dev/stdin >/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 и начальным битрейтом 8500kb/sec.
Опция mpeg2enc —keep-hf позволяет сохранить максимальное качество, хотя качество в первую очередь сильно зависит от оригинала.Иногда требуется подкорректировать размер как это сделать в общем случае мы уже рассматривали.
[sergej@grinder work]$ lav2yuv editlist | yuvscaler -I USE_400x400+50+100 | yuvplay
Здесь мы только принимаем изображение и масштабируем это до нужного размера кадра. Но yuvscaler также изменяет формат изображения пиксела. Это означает, когда вы смотрите на поток, используя yuvplay, это напоминает квадрат в нашем примере. После вычисления, если бы типовой формат изображения (пиксела) не был изменен, видео не показало бы с надлежащим 4:3 форматом изображения. Yuvscaler компенсирует, корректируя типовой формат изображения и из-за которого и видите это 4:3 изображение снова. Из-за черезстрочной развертки, высота и HeightOffset должна будет множитель 4, если видео чередуется. Еще значения (ширина, высота, widthoffset, heightoffset) должны иметь множитель 2. Второй проблемой может быть неправильная центровка т.е. с одной стороны черное изображение, а с другой все нормально. Для центровки по горизонтали применяется утилита 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, пропуская кадры или повышает framerate копируя кадры.
Поскольку кадры только копируются (удаляются), поначалу необходимо denoise и затем уже в следующем шаге заменять 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,97FPS) в формате SVCD.
Далее в кратце пару дополняющих утилит которые необходимо установить отдельно.
Чтобы связать некоторые утилиты с интерфейсом ImageMagick’a можно воспользоваться программой yuvmagick, которую можно найти на http://wave.prohosting.com/espsw.
По адресу http://www.mir.com/DMG/Software/y4mscaler.html, можно найти утилиту y4mscaler позволяющую масштабировать, обрезать и сдвигать видеопотоки, дополнительно с помощью ее можно мимоходом подкорректировать цветовую насыщенность. Только об этом дополнении можно отдельную статью написать.
Например берем центр 100×100 NTSC DV потока, окружаем синей декорационной падугой в 20 пиксел и переводим до полноэкранного SuperVCD потока:
y4mscaler -I active=140×140+0+0cc -I matte=100×100+0+0cc -I bg=RGB:0,0,255 -O preset=svcd
И еще одна родственная утилита dv2jpg (http://sourceforge.net/projects/dv2jpg/) позволяющая перекодировать DV закодированный кодеком AVI поток (из dvgrab, например) к jpeg -кодированному AVI потоку, который может быть обработан mjpeg пакетом или просто записан на VCD.
На этом пожалуй и остановимся. Последний сюрприз я оставил на конец. Дело в том, что такой мощный пакет как mjpegtools в архиве занимает чуть меньше 2 Мб. Так, что выбирайте либо красивая программа в Windows потребляющая много ресурсов только на прорисовку самой себя и стоящую тысячи, либо маленькая совсем маленькая, но бесплатная и очень быстрая в Linux. Linux forever.