Карантин – чудесное время, чтобы чему-нибудь научиться. Однако, как вы понимаете, чтобы кто-то чему-то научился, кто-то должен учить. Если у вас есть презентация, с которой вы хотите выступить перед миллионной аудиторией, снискав мировую славу, то эта статья – для вас. Здесь будет пошаговая инструкция, как из презентации сделать видеоролик.
Путь записи «звуковых комментариев» в PowerPoint и экспорта презентации в видео мы отметаем, как тривиальный и не дающий десятой доли тех возможностей, какие нужны для по-настоящему классного ролика.
Для начала определимся, какие кадры нам понадобятся:
- Собственно слайды с закадровым голосом
- Смена слайдов
- Цитаты-перебивки из популярных фильмов
- Несколько кадров с физиономией лектора и любимым котом (опционально)
Создаём структуру каталогов
.
├── clipart
├── clips
├── rec
├── slide
└── sound
Назначение каталогов в порядке перечисления: фильмы, из которых будем дёргать цитаты (clipart), фрагменты нашего будущего ролика (clips), ролики с камеры (rec), слайды в виде картинок (slide), звук (sound).
Делаем презентацию в картинках
Для настоящего
pdftocairo -png -r 128 ../lecture.pdf
Если такой команды нет, поставьте себе пакет poppler-utils (инструкции для Ubuntu; если у вас Arch, то вы и без меня прекрасно знаете, что делать).
Здесь и далее я считаю, что ролик готовится в формате HD Ready, т. е. 1280×720. Презентация размером по горизонтали 10 дюймов даёт при выгрузке именно такой размер (см. параметр -r 128).
Готовим текст
Если хотите сделать действительно классный материал, то вашу речь необходимо сначала написать. Я тоже думал, что смогу наговорить текст без подготовки, тем более, что опыт чтения лекций у меня неплохой. Но одно дело – выступать вживую, а другое – записывать видео. Не поленитесь – затраченное на набор текста время окупится неоднократно.
Вот мой формат записи. Номер в заголовке равен номеру слайда, красным выделены перебивки. Для подготовки годится любой редактор, но лучше всё же взять полноценный текстовый процессор – например, OnlyOffice.
Озвучиваем слайды
Что тут сказать – включаете микрофон и пишете :)
Опыт показывает, что качество записи даже с самого дешёвого внешнего микрофона несравненно лучше, чем со встроенного микрофона ноутбука. Если хочется качественного оборудования, то рекомендую вот эту статью.
Для записи я использовал audio-recorder – совсем простое приложение для звукозаписи. Взять её можно, например, вот тут:
sudo add-apt-repository ppa:audio-recorder/ppa
sudo apt-get update
sudo apt-get install audio-recorder
Главное на этом шаге – правильное именование файлов. Имя должно состоять из номера слайда и номера фрагмента. Фрагменты нумеруются нечётными числами – 1, 3, 5 и т. д. Так, для слайда, текст которого приведён на картинке, будут созданы два файла: 002-1.mp3 и 002-3.mp3.
Если вы записали все ролики за один раз в тихой комнате, дальше с ними ничего можно не делать. Если записывали в несколько приёмов, лучше выровнять уровень громкости:
mp3gain -r *.mp3
Утилиты mp3gain почему-то нет в стандартных репозиториях, но взять её можно тут:
sudo add-apt-repository ppa:flexiondotorg/audio
sudo apt-get update
sudo apt-get install mp3gain
После всего этого нужно записать ещё один файл с тишиной. Он необходим, чтобы добавлять звуковую дорожку в беззвучные ролики: если в одном ролике есть звуковая дорожка, а в другом нет, то склеить эти ролики сложно. Тишину можно записать с микрофона, но лучше создать файл в редакторе Audacity. Длина файла должна быть не меньше секунды (можно больше), а назвать его стоит silence.mp3
Готовим ролики-перебивки
Здесь всё ограничено только вашей фантазией. Для редактирования видео можно использовать редактор Avidemux. Когда-то он был в стандартных репозиториях, но потом его зачем-то выпилили. Нас это не остановит:
sudo add-apt-repository ppa:ubuntuhandbook1/avidemux
sudo apt-get update
sudo apt-get install avidemux2.7-qt5
Инструкций по работе с этим редактором в сети море, да в принципе, там всё интуитивно понятно. Важно соблюсти несколько условий.
Во-первых, разрешение ролика должно совпадать с целевым разрешением ролика. Для этого в «видео для выхода» нужно использовать два фильтра: swsResize для изменения разрешения и «добавление полей» чтобы сделать из советского «узкоформатного» фильма широкий формат. Все остальные фильтры – по желанию. Например, если кто-то не понимает, к чему в обсуждаемом фрагменте высказывание г-на Шарикова, при помощи фильтра «добавить логотип» можно поверх «Собачьего сердца» наложить логотип PostgreSQL.
Во-вторых, во всех фрагментах нужно использовать одну и ту же частоту кадров. Я использую 25 кадров в секунду, потому что столько даёт моя камера и старые советские фильмы. Если кино, из которого вы вырезаете кадр, снято с другой скоростью, используйте фильтр «ресамплировать видео».
В-третьих, все фрагменты должны быть сжаты одним и тем же кодеком и упакованы в одинаковые контейнеры. Поэтому в Avidemux для формата выбирайте видео – «Mpeg4 AVC (x264)», аудио – «AAC (Faac)», выходной формат – «MP4 Muxer».
В-четвёртых, важно правильно именовать вырезанные ролики. Имя файла должно состоять из номера слайда и номера фрагмента. Фрагменты нумеруются чётными числами, начиная с 2. Так, для обсуждаемого кадра ролик с перебивкой должен называться 002-2.mp4
После того, как ролики готовы, надо перенести их в каталог с фрагментами. Настройки avidemux отличаются от настроек ffmpeg по умолчанию загадочными параметрами tbr, tbn, tbc. На воспроизведение они не влияют, но склеивать ролики не дают. Поэтому перекодируем:
for f in ???-?.mp4;
do
ffmpeg -hide_banner -y -i "${f}" -c copy -r 25 -video_track_timescale 12800 ../clips/$f
done
Снимаем заставки
Здесь тоже всё просто: снимаетесь на фоне какой-нибудь умной схемы, складываете полученные ролики в каталог rec, а оттуда переносите в каталог с фрагментами. Правила именования – такие же, как для цитат-перебивок, команда перекодировки такая:
ffmpeg -y -i source_file -r 25 -vcodec libx264 -pix_fmt yuv420p -profile:v high -coder 1 -s 1280x720 -ar 44100 -ac 2 ../clips/xxx-x.mp4
Если планируете начать ролик со своего выступления, назовите этот фрагмент 000-1.mp4
Делаем кадры из статичных картинок
Пришла пора монтировать ролики из статичных картинок и звука. Делается это таким скриптом:
#!/bin/bash
for sound in sound/*.mp3
do
soundfile=${sound##*/}
chunk=${soundfile%%.mp3}
clip=${chunk}.mp4
pic=slide/${chunk%%-?}.png
duration=$(soxi -D ${sound} 2>/dev/null)
echo ${sound} ${pic} ${clip} " - " ${duration}
ffmpeg -hide_banner -y -loop 1 -i ${pic} -i ${sound} -r 25 -vcodec libx264 -tune stillimage -pix_fmt yuv420p -profile:v high -coder 1 -t ${duration} clips/${clip}
done
Обратите внимание, что сначала определяется продолжительность звукового файла утилитой soxi, а потом монтируется видео нужной длины. Все найденные мной рекомендации проще: вместо флага -t ${duration} используется флаг -shortest. На самом деле ffmpeg определяет длину mp3 очень приблизительно, и при монтаже длина звуковой дорожки может сильно (на одну-две секунды) отличаться от длины видеодорожки. Это не имеет значения, если всё видео состоит из единственного кадра, но при склеивании такого ролика с перебивкой на границе возникают крайне неприятные эффекты с заиканием.
Ещё один способ определить продолжительность mp3-файла – использовать mp3info. Она тоже ошибается, причём иногда ffmpeg даёт больше, чем mp3info, иногда наоборот, иногда врут оба – закономерности я не заметил. А вот soxi работает корректно.
Чтобы поставить себе эту полезную утилиту, сделайте так:
sudo apt-get install sox libsox-fmt-mp3
Делаем переходы между слайдами
Переход – короткий ролик, в котором один слайд превращается в другой. Для изготовления таких роликов берём слайды попарно и при помощи imagemagick превращаем один в другой:
#!/bin/bash
BUFFER=$(mktemp -d)
for pic in slide/*.png
do
if [[ ${prevpic} != "" ]]
then
clip=${pic##*/}
clip=${clip/.png/-0.mp4}
#
# генерируем картинки
#
./fade.pl ${prevpic} ${BUFFER} 1280 720 5 direct 0
./fade.pl ${pic} ${BUFFER} 1280 720 5 reverse 12
#
# закончили генерировать картинки
#
ffmpeg -y -hide_banner -i "${BUFFER}/%03d.png" -i sound/silence.mp3 -r 25 -y -acodec aac -vcodec libx264 -pix_fmt yuv420p -profile:v high -coder 1 -shortest clips/${clip}
rm -f ${BUFFER}/*
fi
prevpic=${pic}
done
rmdir ${BUFFER}
Мне почему-то захотелось, чтобы слайд рассыпался точками, а потом из точек собирался следующий слайд, и для этого я написал скрипт под названием fade.pl Имея imagemagick, настоящий линуксоид скреативит любой спецэффект, но если кому-то нравится моя идея с рассыпанием, то вот скрипт:
#!/usr/bin/perl
use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use Encode qw(decode);
use I18N::Langinfo qw(langinfo CODESET);
my $codeset = langinfo(CODESET);
@ARGV = map { decode $codeset, $_ } @ARGV;
my ($source, $target, $width, $height, $pixsize, $rev, $file_no) = @ARGV;
my @rects;
$rects[$_] = "0123456789AB" for 0..$width*$height/$pixsize/$pixsize/12 - 1;
for my $i (0..11) {
substr($_,int(rand(12-$i)),1) = "" for (@rects);
my $s = $source;
$s =~ s#^.*/##;
open(PICTURE,"| convert - -transparent white PNG:- | convert \"$source\" - -composite \"$target/".substr("00".($file_no+$i),-3).".png\"");
printf PICTURE ("P3\n%d %d\n255\n",$width,$height);
for my $row (1..$height/$pixsize/3) {
for my $j (0..2) {
my $l = "";
for my $col (1..$width/$pixsize/4) {
for my $k (0..3) {
$l .= (index($rects[($row-1)*$width/$pixsize/4+$col-1],sprintf("%1X",$j*4+$k))==-1 xor $rev eq "reverse") ? "0 0 0\n" : "255 255 255\n" for (1..$pixsize);
}
}
print PICTURE ($l) for (1..$pixsize);
}
}
close(PICTURE);
}
Монтируем готовый ролик
Вот теперь у нас есть все фрагменты. Переходим в каталог clips и собираем готовый фильм двумя командами:
ls -1 ???-?.mp4 | gawk -e '{print "file " $0}' >list.txt
ffmpeg -y -hide_banner -f concat -i list.txt -c copy MOVIE.mp4
Приятного просмотра вашим благодарным ученикам!