Pull to refresh

Видеолекции: unix way

Reading time 6 min
Views 3.4K

Карантин – чудесное время, чтобы чему-нибудь научиться. Однако, как вы понимаете, чтобы кто-то чему-то научился, кто-то должен учить. Если у вас есть презентация, с которой вы хотите выступить перед миллионной аудиторией, снискав мировую славу, то эта статья – для вас. Здесь будет пошаговая инструкция, как из презентации сделать видеоролик.

Путь записи «звуковых комментариев» в PowerPoint и экспорта презентации в видео мы отметаем, как тривиальный и не дающий десятой доли тех возможностей, какие нужны для по-настоящему классного ролика.

Для начала определимся, какие кадры нам понадобятся:

  1. Собственно слайды с закадровым голосом
  2. Смена слайдов
  3. Цитаты-перебивки из популярных фильмов
  4. Несколько кадров с физиономией лектора и любимым котом (опционально)


Создаём структуру каталогов


.
├── clipart
├── clips
├── rec
├── slide
└── sound

Назначение каталогов в порядке перечисления: фильмы, из которых будем дёргать цитаты (clipart), фрагменты нашего будущего ролика (clips), ролики с камеры (rec), слайды в виде картинок (slide), звук (sound).

Делаем презентацию в картинках


Для настоящего красноглазика линуксоида сделать презентацию в виде картинок не представляет никаких проблем. Напомню лишь, что документ в формате pdf можно разобрать на изображения командой

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

Приятного просмотра вашим благодарным ученикам!
Tags:
Hubs:
+12
Comments 5
Comments Comments 5

Articles