Відеомонтаж у консолі Linux
Це архів рецептів MPlayer/MEncoder і FFmpeg описаного періоду. Частина пакетів, кодеків, адрес завантаження та параметрів збирання застаріла. Приклади документують початковий робочий процес; перед адаптацією звіртеся з документацією встановленої утиліти. Нарізання без перекодування зазвичай обмежене ключовими кадрами, а склеювання потоків потребує сумісних кодеків і параметрів контейнера.
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. Кадр береться з шістнадцятої секунди. Варто було б перевіряти тривалість, бо ролик може бути коротшим; це залишається вправою для читача. У прикладі вихідний файл зберігається при помилці перетворення, а для кожної мініатюри використовується окремий робочий каталог.
Потрібні програми:
mencoderдля перетворення;mplayerдля отримання кадру;convertіз ImageMagick для зміни розміру мініатюри;flvtool2для запису метаданих FLV.
#!/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/