Відеолекції: unix way

Відеолекції: unix way
Карантин – чудовий час, щоб чогось навчитися. Однак, як ви розумієте, щоб хтось чогось навчився, хтось має вчити. Якщо у вас є презентація, з якою ви хочете виступити перед мільйонною аудиторією, здобувши світову славу, то ця стаття – для вас. Тут буде покрокова інструкція, як із презентації зробити відеоролик.

Шлях запису «звукових коментарів» у 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).

Готуємо текст

Якщо хочете зробити справді класний матеріал, то ваше мовлення потрібно спочатку написати. Я теж думав, що зможу наговорити текст без підготовки, тим більше досвід читання лекцій у мене непоганий. Але одна річ – виступати наживо, а інша – записувати відео. Не полінуйтеся - витрачений на набір тексту час окупиться неодноразово.

Відеолекції: unix way

Ось мій формат запису. Номер у заголовку дорівнює номеру слайду, червоним виділено перебиття. Для підготовки годиться будь-який редактор, але краще все ж таки взяти повноцінний текстовий процесор – наприклад, OnlyOffice.

Озвучуємо слайди

Що тут сказати - включає мікрофон і пишете 🙂

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

Для запису я використав аудіозапис - Дуже простий додаток для звукозапису. Взяти її можна, наприклад, ось тут:

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

Після цього потрібно записати ще один файл з тишею. Він необхідний, щоб додавати звукову доріжку до беззвучних роликів: якщо в одному ролику є звукова доріжка, а в іншому ні, то склеїти ці ролики складно. Тишу можна записати з мікрофона, але краще створити файл у редакторі Зухвалість. Довжина файлу має бути не менше секунди (можна більше), а назвати його варто тиша.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».

По-четверте, важливо правильно назвати вирізані ролики. Ім'я файлу має складатися з номера слайда та номера фрагмента. Фрагменти нумеруються парними числами, починаючи з 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

Знімаємо заставки

Тут теж все просто: знімаєтеся на тлі якоїсь розумної схеми, складаєте отримані ролики в каталог запис, а звідти переносіть у каталог із фрагментами. Правила іменування - такі ж, як для цитат-перебивок, команда перекодування така:

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} використовується прапор -найкоротший. Насправді ffmpeg визначає довжину mp3 дуже приблизно і при монтажі довжина звукової доріжки може сильно (на одну-дві секунди) відрізнятися від довжини відеодоріжки. Це не має значення, якщо все відео складається з єдиного кадру, але при склеюванні такого ролика з перебивкою на кордоні виникають вкрай неприємні ефекти із заїканням.

Ще один спосіб визначити тривалість mp3-файлу – використовувати інформація про mp3. Вона теж помиляється, причому іноді ffmpeg дає більше, ніж інформація про mp3, Іноді навпаки, іноді брешуть обидва - закономірності я не помітив. А от 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 ("P3n%d %dn255n",$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 0n" : "255 255 255n" for (1..$pixsize);
        }
      }
      print PICTURE ($l) for (1..$pixsize);
    }
  }
  close(PICTURE);
}

Монтуємо готовий ролик

Ось тепер ми маємо всі фрагменти. Переходимо до каталогу кліпси і збираємо готовий фільм двома командами:

ls -1 ???-?.mp4 | gawk -e '{print "file " $0}' >list.txt
ffmpeg -y -hide_banner -f concat -i list.txt -c copy MOVIE.mp4

Приємного перегляду вашим вдячним учням!

Джерело: habr.com

Додати коментар або відгук