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 - 320x240 пікселів.

Якщо у вас є веб-камера і ви хочете записати зображення з неї, використовуйте:

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/