Videolezioni: il modo UNIX

Videolezioni: il modo UNIX
La quarantena è un ottimo momento per imparare qualcosa di nuovo. Tuttavia, come sapete, affinché qualcuno possa apprendere, è necessario che qualcun altro insegni. Se avete una presentazione che desiderate mostrare a un pubblico di milioni di persone per guadagnare fama mondiale, questo articolo è per voi. Qui troverete una guida passo passo su come trasformare una presentazione in un video.

Escludiamo il percorso di registrazione dei "commenti audio" in PowerPoint e l'esportazione della presentazione in video, poiché è banale e non offre nemmeno un decimo delle possibilità necessarie per un video di grande qualità.

Iniziamo a definire quali clip ci serviranno:

  1. Le diapositive con voce narrante
  2. Cambio delle diapositive
  3. Citazioni da film famosi
  4. Alcune clip con il volto del relatore e un gatto adorato (opzionale)

Creiamo la struttura delle cartelle

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

Scopo delle cartelle nell'ordine elencato: film da cui estrarre le citazioni (clipart), frammenti del nostro futuro video (clips), riprese dalla telecamera (rec), diapositive in forma di immagini (slide), audio (sound).

Creiamo la presentazione in immagini

Per un vero fan di Linux, creare una presentazione in forma di immagini non presenta alcun problema. Ricordo solo che un documento in formato PDF può essere estratto in immagini con il comando

pdftocairo -png -r 128 ../lecture.pdf

Se non hai tale comando, installa il pacchetto poppler-utils (istruzioni per Ubuntu; se hai Arch, sai già benissimo cosa fare).

Da qui in poi, considero che il video venga realizzato in formato HD Ready, ossia 1280×720. Una presentazione larga 10 pollici produce esattamente questa dimensione quando esportata (vedi il parametro -r 128).

Prepariamo il testo

Se vuoi creare un materiale davvero impressionante, prima devi scrivere il tuo discorso. Anche io pensavo di poter registrare il testo senza preparazione, soprattutto perché ho una buona esperienza di lettura delle lezioni. Ma è una cosa parlare dal vivo, un’altra registrare un video. Non risparmiare tempo – il tempo speso a scrivere il testo si ripagherà più volte.

Videolezioni: il modo UNIX

Questo è il mio formato di registrazione. Il numero nel titolo corrisponde al numero della slide, le transizioni sono evidenziate in rosso. Puoi usare qualsiasi editor per la preparazione, ma è meglio optare per un vero elaboratore di testi – ad esempio, OnlyOffice.

Commentiamo le diapositive

Che dire - accendi il microfono e inizia a scrivere 🙂

L'esperienza dimostra che la qualità della registrazione, anche con il microfono esterno più economico, è incomparabilmente migliore rispetto a quella del microfono incorporato nel laptop. Se desideri attrezzature di qualità, ti consiglio questo articolo.

Per la registrazione ho utilizzato audio-recorder è un'applicazione molto semplice per la registrazione audio. Puoi trovarla, ad esempio, qui:

sudo add-apt-repository ppa:audio-recorder/ppa
sudo apt-get update
sudo apt-get install audio-recorder

La cosa importante in questo passaggio è la corretta denominazione dei file. Il nome deve consistere nel numero della diapositiva e nel numero del frammento. I frammenti sono numerati con numeri dispari: 1, 3, 5, ecc. Così, per la diapositiva il cui testo è riportato nell'immagine, verranno creati due file: 002-1.mp3 e 002-3.mp3.

Se hai registrato tutti i video in una sola volta in una stanza silenziosa, non c'è niente da fare ulteriormente. Se hai registrato in più sessioni, è meglio livellare il volume:

mp3gain -r *.mp3

Utilità mp3gain per qualche motivo non è disponibile nei repository standard, ma puoi trovarla qui:

sudo add-apt-repository ppa:flexiondotorg/audio
sudo apt-get update
sudo apt-get install mp3gain

Dopo tutto questo, è necessario registrare un ulteriore file di silenzio. Questo è essenziale per aggiungere una traccia audio ai video silenziosi: se in un video c'è una traccia audio e in un altro no, risulta difficile unire questi video. Il silenzio può essere registrato tramite un microfono, ma è preferibile creare un file in un editor. AudacityLa lunghezza del file deve essere di almeno un secondo (può essere più lungo), e dovreste chiamarlo silence.mp3

Prepariamo i video di transizione

Qui tutto è limitato solo dalla vostra fantasia. Per modificare i video, potete utilizzare l'editor Avidemux. Una volta era disponibile nei repository standard, ma poi è stato rimosso per qualche motivo. Questo non ci ferma:

sudo add-apt-repository ppa:ubuntuhandbook1/avidemux
sudo apt-get update
sudo apt-get install avidemux2.7-qt5

Ci sono molte istruzioni su come lavorare con questo editor online, e in effetti, tutto è abbastanza intuitivo. È importante rispettare alcune condizioni.

In primo luogo, la risoluzione del video deve corrispondere alla risoluzione target. A tal fine, nel "video di uscita" è necessario utilizzare due filtri: swsResize per cambiare la risoluzione e "aggiunta di bordi" per trasformare un film sovietico 'a formato stretto' in un formato widescreen. Tutti gli altri filtri sono facoltativi. Ad esempio, se qualcuno non comprende cosa intende dire il signor Sharikov nel frammento discusso, usando il filtro "aggiungi logo" è possibile sovrapporre il logo di PostgreSQL su "Cuore di cane".

In secondo luogo, in tutti i frammenti è necessario utilizzare la stessa frequenza dei fotogrammi. Uso 25 fotogrammi al secondo, perché è quella che la mia camera e i vecchi film sovietici forniscono. Se il film da cui si estrae il fotogramma è stato girato a una diversa velocità, utilizzare il filtro "risampling video".

In terzo luogo, tutti i frammenti devono essere compressi con lo stesso codec e imballati in contenitori identici. Pertanto in Avidemux per il formato scegliete video – "Mpeg4 AVC (x264)", audio – "AAC (Faac)", formato di uscita – "MP4 Muxer».

In quarto luogo, è fondamentale nominare correttamente i video tagliati. Il nome del file deve consistere nel numero della diapositiva e nel numero del frammento. I frammenti sono numerati con numeri pari, a partire da 2. Quindi, per il frame discusso, il video con il collegamento dovrebbe chiamarsi 002-2.mp4

Dopo aver preparato i video, bisogna trasferirli nella cartella dei frammenti. Le impostazioni avidemux si differenziano dalle impostazioni ffmpeg di default con parametri misteriosi tbr, tbn, tbc. Non influiscono sulla riproduzione, ma non permettono di unire i video. Pertanto, ricodifichiamo:

for f in ???-?.mp4;
do
  ffmpeg -hide_banner -y -i "${f}" -c copy -r 25 -video_track_timescale 12800 ../clips/$f
done

Registriamo le intro

Qui è tutto semplice: registratevi su uno sfondo di uno schema intelligente, mettete i video ottenuti nella cartella rec, e da lì trasferiteli nella cartella dei frammenti. Le regole di denominazione sono le stesse di quelle per le citazioni collegate, il comando di ricodifica è il seguente:

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

Se pianificate di iniziare il video con la vostra presentazione, nominate questo frammento 000-1.mp4

Creiamo frame da immagini statiche

È arrivato il momento di montare i video da immagini statiche e audio. Questo si fa con il seguente script:

#!/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

Si prega di notare che la durata del file audio viene prima determinata dall'utility soxi, e poi si monta un video della lunghezza desiderata. Tutte le raccomandazioni che ho trovato sono più semplici: invece del flag -t ${duration} si utilizza il flag -shortest. In realtà ffmpeg determina la lunghezza mp3 in modo molto approssimativo, e durante il montaggio la lunghezza della traccia audio può differire notevolmente (di uno o due secondi) dalla lunghezza della traccia video. Questo non ha importanza se tutto il video è composto da un'unica inquadratura, ma quando si unisce un tale video con una transizione al confine si verificano effetti molto sgradevoli di interruzione.

Un altro modo per determinare la durata di un file mp3 è utilizzare mp3info. Anche questo commette errori, e a volte ffmpeg dà più di mp3info, altre volte viceversa; a volte entrambi mentono - non ho notato regolarità. Ma soxi funziona correttamente.

Per installare questa utile utility, procedi così:

sudo apt-get install sox libsox-fmt-mp3

Facciamo transizioni tra le diapositive

Una transizione è un breve video in cui una diapositiva si trasforma nell'altra. Per realizzare tali video prendiamo le diapositive a coppie e con l'aiuto di imagemagick trasformiamo una nell'altra:

#!/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}

A un certo punto, ho pensato che il diapositivo dovesse disperdersi in punti, e poi i punti dovessero ricomporsi nel diapositivo successivo. Per questo ho scritto uno script chiamato fade.pl Avendo imagemagick, un vero appassionato di Linux può creare qualsiasi effetto speciale, ma se a qualcuno piace la mia idea della dispersione, ecco lo script:

#!/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);
}

Montiamo il video pronto

Ora abbiamo tutti i frammenti. Passiamo alla cartella clips e assembliamo il film finale con due comandi:

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

Buona visione ai vostri grati studenti!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster