dimabagow

Видеомонтаж в консоли Linux

Это архив рецептов MPlayer/MEncoder и FFmpeg описанного периода. Часть пакетов, кодеков, адресов загрузки и параметров сборки устарела. Примеры документируют исходный рабочий процесс; перед адаптацией сверьтесь с документацией установленной утилиты. Нарезка без перекодирования обычно ограничена ключевыми кадрами, а склейка потоков требует совместимых кодеков и параметров контейнера.

Видеомонтаж в консоли Linux

Linux считается отличной платформой для работы с видео. На нём работают целые центры обработки видео и звука, а также множество профессиональных студий. Например, постобработка мультфильма «Мадагаскар» делалась в Linux. Список известных картин можно продолжать долго, но здесь я расскажу об обработке домашнего видео.

Для этого есть хороший набор программ. Людям, совсем не знакомым с Linux, придётся немного разобраться. Но это стоит усилий, а платить необязательно: многие программы бесплатны.

Один из известных инструментов обработки видео в Linux, MEncoder, работает в терминале. Это большой плюс, поскольку обработку можно автоматизировать скриптами. Видеосерверы могут использовать его для автоматического преобразования файлов. Если вы только перешли на Linux и командная строка вызывает ужас, существуют и графические оболочки: они просто не входят в MEncoder по умолчанию. Несколько вариантов приведены ниже, но сначала разберёмся с командами.

MEncoder входит в проект MPlayer, инструменты которого охватывают воспроизведение, захват, запись, трансляцию и преобразование видео. Согласно энциклопедическому описанию, MEncoder преобразует аудио- и видеоформаты, поддерживает множество кодеков и медиаконтейнеров и использует библиотеку libavcodec.

MPlayer обычно представляют как медиапроигрыватель, а преобразование и другие функции выполняют связанные с ним программы. В устройстве пакетов можно запутаться, но инструменты относятся к одному проекту. В этой статье я познакомлю вас с несколькими из них. Сайт проекта: mplayerhq.hu.

Для начала установим нужные программы. Проверьте, нет ли уже MPlayer и MEncoder в вашем дистрибутиве. В системах на основе Debian команда такая:

apt-get install mencoder mplayer

Эти примеры относятся ко времени MEncoder, FLV и устройств PocketPC. Названия пакетов, серверы загрузки и параметры сборки ниже соответствуют тем версиям.

Часто используемые команды

Преобразовать MPG в AVI

mencoder slobodnasrbija1912.mpg -o slobodna.avi -ovc lavc -oac lavc

Разделить AVI на части

avisplit -s 37 -i bagow-001.avi

Преобразовать AVI в FLV

mencoder INPUT.avi -ofps 25 -o OUTPUT.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:keyint=50:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240

Разделить FLV на части

ffmpeg -i input_file.flv -ss 00:00:00 -t 00:30:00 -vcodec copy -acodec copy output_file_1.flv

ffmpeg -i input_file.flv -ss 00:30:00 -vcodec copy -acodec copy output_file_2.flv

Вырезать фрагмент из AVI

mencoder -oac copy -ovc copy -ss 00:00:00 -endpos 00:00:02 video.avi -o kusok.avi

Преобразовать MTS или M2TS в AVI

mencoder 00001.mts -o 1.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=10000 -fps 60 -vf scale=1140:1080

Воспроизвести видео символами ASCII

mplayer -vo aa [name_of_videofile]

Демон преобразования видео в FLV

Нашёл на Habr полезную статью и сохранил приведённый ниже пример демона. Он следит за каталогом загрузки, переносит новые видео во временный каталог, запускает преобразование в фоне, создаёт миниатюру и помещает готовые файлы в каталог пользователя.

Скрипт написан на Bash, поэтому для постоянной работы его запускают через nohup или screen. Исходный вариант не ограничивает количество одновременных преобразований: активная загрузка файлов может перегрузить сервер. Для нагрузки автора это было некритично. Если вам такое решение не подходит, можно организовать очередь с помощью flock.

Основные параметры задаются в командной строке; -h показывает их список. Параметр -u задаёт корневой каталог пользовательских папок. Структура жёстко определена в скрипте: преобразованные видео попадают в USER_FOLDER/USER_ID/video. Чтобы изменить её, придётся поправить код.

Параметры -s и -t задают исходный и промежуточный каталоги. Файлы в исходном каталоге, по умолчанию /var/videoinput, должны иметь имя USER_ID_VIDEO_ID.ext. Первое число обозначает папку пользователя, второе идентифицирует видео, например его запись в базе данных.

Миниатюра сохраняется рядом с видео под тем же именем, но с расширением .png. Кадр берётся с шестнадцатой секунды. По-хорошему, надо проверять длительность, ведь ролик может быть короче; это оставляю как самостоятельную работу. В примере исходник сохраняется при ошибке преобразования, а для каждой миниатюры используется отдельный рабочий каталог.

Необходимые программы:

#!/bin/bash
# folder_monitor.sh
SRC_DIR=/var/videoinput
TRG_DIR=/var/videooutput
PARAMS='-ovc lavc -lavcopts vcodec=flv:keyint=50:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=480:360 -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050'
OUTPUT_FORMAT=flv
USER_FOLDER=/usr/local/jboss/server/default/resources/files/user_folders
THUMBNAIL_WIDTH=175
THUMBNAIL_HEIGHT=110
while getopts ':s:t:hp:u:H:W:' optname; do
    case "$optname" in
        u) USER_FOLDER=$OPTARG ;;
        p) PARAMS=$OPTARG ;;
        s) SRC_DIR=$OPTARG ;;
        t) TRG_DIR=$OPTARG ;;
        W) THUMBNAIL_WIDTH=$OPTARG ;;
        H) THUMBNAIL_HEIGHT=$OPTARG ;;
        h)
            printf '%s\n' '-h: help' '-W: thumbnail width' \
                '-H: thumbnail height' '-p: mencoder options' \
                '-u: user folders' '-s: source directory' \
                '-t: intermediate directory'
            exit 0 ;;
        *) printf 'Invalid option: %s\n' "$OPTARG" >&2; exit 1 ;;
    esac
done
mkdir -p "$SRC_DIR" "$TRG_DIR" "$USER_FOLDER" || exit 1
SRC_DIR=$(cd "$SRC_DIR" && pwd) || exit 1
TRG_DIR=$(cd "$TRG_DIR" && pwd) || exit 1
USER_FOLDER=$(cd "$USER_FOLDER" && pwd) || exit 1
read -r -a ENCODER_OPTIONS <<< "$PARAMS"
while :; do
    printf 'Looking in %s...\n' "$SRC_DIR"
    while IFS= read -r -d '' INPUT; do
        FILE=${INPUT##*/}
        [[ $FILE =~ ^([0-9]+)_([0-9]+)\.[A-Za-z0-9]+$ ]] || continue
        USER_ID=${BASH_REMATCH[1]}
        VIDEO_ID=${BASH_REMATCH[2]}
        JOB_DIR=$(mktemp -d "$TRG_DIR/job.XXXXXX") || continue
        if ! mv -- "$INPUT" "$JOB_DIR/$FILE"; then
            rmdir "$JOB_DIR"
            continue
        fi
        (
            cd "$JOB_DIR" || exit 1
            printf 'Converting %s...\n' "$FILE"
            DEST="$USER_FOLDER/$USER_ID/video"
            mkdir -p "$DEST" || exit 1
            if ! mencoder "$FILE" -o "$FILE.$OUTPUT_FORMAT" "${ENCODER_OPTIONS[@]}"; then
                printf 'Conversion failed; source retained in %s\n' "$JOB_DIR" >&2
                exit 1
            fi
            flvtool2 -UP "$FILE.$OUTPUT_FORMAT" || exit 1
            if mplayer -ss 16 -frames 1 -vo png -nosound "$FILE" && [ -f 00000001.png ]; then
                convert 00000001.png -resize "$THUMBNAIL_WIDTH" \
                    -gravity center -crop "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}+0+0" \
                    -quality 75 "$DEST/$VIDEO_ID.png"
            fi
            mv -- "$FILE.$OUTPUT_FORMAT" "$DEST/$VIDEO_ID.$OUTPUT_FORMAT" || exit 1
            rm -- "$FILE"
            rm -f -- 00000001.png
            cd "$TRG_DIR" || exit 1
            rmdir "$JOB_DIR"
        ) &
    done < <(find "$SRC_DIR" -maxdepth 1 -type f -print0)
    sleep 10
done

Установка на сервер

Ниже сохранена последовательность сборки с исходными версиями для сервера на основе RPM: LAME, Ogg/Vorbis, MPlayer, FFmpeg, FLVTool2 и расширение PHP. Старые адреса загрузки приведены в историческом контексте.

cd /usr/local/src/

# DOWNLOAD MODULES

wget www3.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2
wget -O flvtool2_1.0.5_rc6.tgz http://rubyforge.org/frs/download.php/9225/flvtool2_1.0.5_rc6.tgz
wget easynews.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz
wget superb-west.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.5.1.tbz2
wget downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz
wget downloads.xiph.org/releases/vorbis/libvorbis-1.1.2.tar.gz

# EXTRACT MODULES

tar zxvf lame-3.97.tar.gz
tar zxvf libogg-1.1.3.tar.gz
tar zxvf libvorbis-1.1.2.tar.gz
tar zxvf flvtool2_1.0.5_rc6.tgz
tar jxvf essential-20061022.tar.bz2
tar jxvf ffmpeg-php-0.5.1.tbz2

mkdir /usr/local/lib/codecs/

yum install gcc gmake make libcpp libgcc libstdc++ gcc4 gcc4-c++ gcc4-gfortran subversion ruby ncurses-devel -y

DOWNLOAD FFMPEG and MPLAYER

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer
cd /usr/local/src/mplayer

svn update

cd /usr/local/src/
mv /usr/local/src/essential-20061022/* /usr/local/lib/codecs/
chmod -R 755 /usr/local/lib/codecs/

# LAME:

cd /usr/local/src/lame-3.97
./configure
make && make install

# LIBOGG

cd /usr/local/src/
cd /usr/local/src/libogg-1.1.3
./configure --enable-shared && make && make install
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

# LIBVORBIS

cd /usr/local/src/
cd /usr/local/src/libvorbis-1.1.2
./configure && make && make install

# FLVTOOL2

cd /usr/local/src/
cd /usr/local/src/flvtool2_1.0.5_rc6/
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install

# MPLAYER

cd /usr/local/src/
cd /usr/local/src/mplayer
./configure && make && make install

cd /usr/local/src/

# FFMPEG:

cd /usr/local/src/ffmpeg/
./configure --enable-libmp3lame --enable-libvorbis --disable-mmx --enable-shared
make
make install

export LD_LIBRARY_PATH=/usr/local/lib/

ln -s /usr/local/lib/libavformat.so.50 /usr/lib/libavformat.so.50
ln -s /usr/local/lib/libavcodec.so.51 /usr/lib/libavcodec.so.51
ln -s /usr/local/lib/libavutil.so.49 /usr/lib/libavutil.so.49
ln -s /usr/local/lib/libmp3lame.so.0 /usr/lib/libmp3lame.so.0
ln -s /usr/local/lib/libavformat.so.51 /usr/lib/libavformat.so.51

# FFMPEG-PHP:

cd /usr/local/src/
cd /usr/local/src/ffmpeg-php-0.5.1/
phpize
./configure
make
make install

NOTICE: Make sure this is the correct php.ini for the box!!

echo 'extension=ffmpeg.so' >> /usr/local/Zend/etc/php.ini

NOTICE: Make sure this is the correct php.ini for the box!!

# RESTART APACHE

service httpd restart

Ещё одна статья о MEncoder

Источник: boombick.org/blog/posts/19.

MEncoder является утилитой преобразования, поставляемой вместе с MPlayer. MPlayer воспроизводит аудио и видео, а MEncoder обрабатывает их и преобразует между форматами. Есть множество графических оболочек, но следующие примеры показывают возможности командной строки.

Mencoder поддерживает множество типов файлов, вот некоторые из них: MPEG/VOB, AVI, ASF/WMA/WMV, RM, QT/MOV/MP4, Ogg/OGM, MKV, VIVO, FLI, FLV. Синтаксис команд довольно прост, несмотря на большое количество опций. Несмотря на свой «скромный» интерфейс, mencoder может делать с мультимедиа-файлами удивительные вещи.

Простая команда для конвертирования MPG-файла в AVI-формат:

mencoder file.mpg -o file.avi -ovc lavc -oac lavc

Опции -oac и -ovc указывают на желаемые аудио и видео кодеки. Вы можете посмотреть список доступных кодеков при помощи команды mencoder -ovc help и mencoder -oac help

Предположим, что вам нужен несжатый аудиопоток и вы решили использовать PCM. Вы можете указать желаемый формат аудио при помощи опции acodec:

mencoder file.mpg -o file.avi -ovc lavc -oac pcm

Если вы используете mp3-сжатие, можно также указать битрейт:

mencoder file.mpg -o file.avi -ovc lavc -oac lavc -lavcopts acodec=libmp3lame:abitrate=128

Вы можете использовать lameopts, если в вашей системе установлен libmp3lame и вам хочется расширить список опций, доступных при кодировании аудио. Еще с помощью lameopts можно создавать файлы с переменным битрейтом:

mencoder file -o file.avi -ovc lavc -oac mp3lame -lameopts vbr=2:q=3

где q - это любое число в диапазоне от 0 до 9
Также можно работать и с аудиодорожкой из видеофайлов:

mencoder file.mpg -o file.avi -ovc lavc -oac lavc -lavcopts acodec=libmp3lame:abitrate=128:vcodec=mpeg4

Если вы не хотите использовать видеокомпрессию, используйте -ovc copy. С этой опцией видеопоток будет просто скопирован байт в байт из исходного файла.

Вы можете использовать DivX и xvid напрямую, без опции lavc:

mencoder -ovc xvid -oac mp3lame -o destination.avi source.avi

Для указания более подробных параметров вы можете использовать опции xvid

mencoder -ovc xvid -oac mp3lame -xvidencopts bitrate=878 -o destination.avi source.avi

Повышение битрейта увеличивает качество изображения, но вместе с качеством растет и размер файла. Помните об этом.

Следующим шагом, а точнее двумя, будет описание процесса перекодирования DVD в XviD. Сначала mencoder анализирует файл, затем, на основе полученных данных, перекодирует DVD-поток. Использование двух фаз ненамного дольше, но на выходе вы получите более качественный файл. Будьте готовы к тому, что во время процесса кодирования нагрузка на CPU будет порядка 90%:

mencoder dvd:// -oac mp3lame -ovc xvid -xvidencopts pass=1 -o /dev/null
mencoder dvd:// -oac mp3lame -ovc xvid -xvidencopts pass=2:bitrate=800 -o xvidfile.avi

Вы можете указать битрейт для получения необходимого качества. Например, чтобы вместить DVD в 700-мегабайтный xvid-файл, используйте следующие опции:

mencoder dvd:// -ovc xvid -oac mp3lame -xvidencopts bitrate=-700000 -o file.avi

Чтобы снизить приоритет кодирования и уступать процессор другим задачам, используйте nice. Эта команда не ограничивает процент загрузки CPU:

nice -n 19 mencoder dvd:// -ovc xvid -oac mp3lame -xvidencopts bitrate=-700000 -o file.avi

Если у вас есть множество маленьких видеофайлов и вы хотите сделать из них один большой, то mencoder может помочь вам... Переименуйте исходные файлы так, чтобы они отсортировывались в необходимом вам порядке. Затем используйте:

mencoder *.avi -ovc copy -oac copy -o output.avi

Если вы хотите добавить аудиодорожку к видеофайлу, то используйте:

mencoder source.avi -o destination.avi -ovc copy -oac mp3lame -audiofile file.wav
mencoder source.avi -o destination.avi -ovc copy -oac copy -audiofile file.mp3

Для получения видео, пригодного к воспроизведению на iPodLinux используйте:

mencoder -ovc raw -ofps 15 -oac pcm -vf scale=176:-2,expand=176:132,format=bgr16 input.file -o output.avi

Эта команда создаст RAW AVI-файл с несжатым аудиопотоком и масштабирует его к размеру экрана Nano.

У меня есть PocketPC, который частенько сопровождает меня в деловых поездках. Я использую mencoder для получения фильмов, которые уместятся на 512 MB SD-Card и будут воспроизводиться на моем Pocket:

mencoder -oac mp3lame -lameopts mode=3:preset=24 -ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=384:keyint=250 -vf expand="320:240" -o outputfile.avi inputfile.avi

или

mencoder input.avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=200:abitrate=48 -vf scale=320:240 -oac copy -o output.avi

Разница в том, что вторая команда масштабирует фильм до размера экрана PocketPC - 320 *240 пикселей.

Если у вас есть web-камера и вы хотите записать изображение с нее, используйте:

mencoder tv:// -tv driver=v4l:device=/dev/video0:width=640:height=480:forceaudio -ovc lavc -oac lavc -lavcopts vcodec=mpeg4:acodec=mp3 -ffourcc divx -o test.avi

Команда записывает весь вывод /dev/video0 в файл с разрешением 640×480 и mp3-звуком.

Как вы видите, с помощью mencoder можно работать с большим количеством форматов, доступно огромное число опций, он маленький, легкий и очень быстро работает. И я не променяю его ни на одну утилиту с более «дружественным» интерфейсом.

Специально для интересующихся, список фронт-ендов к mencoder:

Kmencoder http://sf.net/projects/kmencoder/
Konverter http://www.libsdl.de/projects/konverter/
Kmenc 15 http://kmenc15.sf.net/
GMencoder http://gmencoder.sf.net/
AcidRIP http://untrepid.com/acidrip/
MenGUI http://jahjah.free.fr/morphos/