Tabela de conteúdos

No Windows

Existem muitas opções de softwares para gravação de vídeos da tela e que servem para a criação de um tutorial.

O CamStudio é um conhecido software livre destinado a este propósito.

No Linux

Usando ffmpeg para gravar a tela

 ffmpeg -f x11grab -s 1920x1080 -r 30 -i :0.0 -q:v 2 meuVideo.avi

Você pode mudar algumas coisas aí. A resolução (1920×1080) a qualidade do vídeo (2 a 31, sendo 2 a melhor) ou o formato do vídeo, bastando alterar a extensão. Aqui não funcionou bem com mp4, que eu preferiria. Há também inúmeras outras opções do ffmpeg que podem ser usadas. Esse comando não grava o áudio, pra isso em geral eu uso o Audacity separadamente, mas também é possível gravar o áudio direto.

Usando audacity ou o próprio ffmpeg para o áudio

Outros softwares para captura da tela:

Legendas direto na tela

Usando esses scripts é possível já colocar legenda na tela pra gravação ao vivo.

É necessário configurar um atalho de teclado que ainda não esteja sendo usado pelo seu gerenciador de janelas (Window Manager). No meu caso, por exemplo, usei o XFCE e configurei o atalho Ctrl+Shift+U para chamar o primeiro script. Ele vai passar a informação ao segundo script para que seja mostrada a próxima legenda.

É necessário instalar a ferramenta “osd_cat”. No meu linux aqui ela vem com o pacote xosd-bin.

Primeiro script (a ser associado ao atalho de teclado do WM):

#!/bin/sh

# Script que atua junto com o "mostra_legendas.sh"
# Deve ser mapeado junto a um atalho de teclado do gerenciador de janelas.
# Por exemplo, no XFCE va na configuracao de teclado e associe um atalho
# a este comando. Toda vez que o atalho for acionado a proxima legenda aparece.

echo > /tmp/mostra_legenda_pipe

Segundo script, a ser executado chamando o arquivo txt com as legendas em até 2 idiomas:

#!/bin/bash

# EN: Script to show subtitles on screen while recording or presenting or
#     generate subtitle files.
# PT_BR: Script pra apresentar legendas na tela durante gravacao de video ou
#        gerar arquivos com legendas.

# EN: Takes a text file, optionally with 2 languages, and shows each in one
#     screen edge (top/bottom) or writes subtitle files
# PT_BR: Pega um arquivo texto, opcionalmente com 2 idiomas, e mostra cada um
#        num canto da tela ou gera os arquivos de legendas.

# A Fazer:
#       - opcao de legenda titulo pra inicio e fim no meio da tela
#       - testar mais idiomas: pt, en, fr, es
#       - tratar tamanho para passar pra proxima linha
#       - publicar (github, sf, ...)
#       - melhorar o inicio/fim de gravacao (expect?)
#       - tirar dependencias externas: video_tela.sh
#       - entender e tratar os n idiomas de entrada. Hoje ta hardcoded pra 2. Pode vir na primeira linha do arquivo, inclusive os nomes dos arq de saida
# Feito:
#       - mapear atalho de teclado pra passar pra proxima
#       - sair apos tocar ultima legenda
#       - aguardar primeiro comando pra tocar primeira legenda
#       - tratar interrupcao bruta

#------------------------
# Requisitos | Requisites
#
# - ffmpeg
# - osd_cat
#       - Para gerar legendas direto no video. Se for gerar apenas arquivos srt nao eh preciso.
#       - To generate onscreen subtitles to be directly recorded. To generate srt files it's not necessary.
# - proxima_legenda.sh
#       - ter o programa
#       - configurar atalho de teclado no Window Manager (ex: xfce, Kde, Gnome, ...) para rodar proxima_legenda.sh

#-------------------------------
# Configuracoes | Configurations
#-------------------------------

# Valores padrao | Default values
# separador de idiomas | language separator
s="|"
# tempo que as legendas ficam na tela (em segundos) | subtitles time on screen
d=5
# tamanho da fonte a ser usada (achei 80 bom para Full HD) | font size (I found 80 good with Full HD)
t=80
# tamanho da borda da legenda | subtitle border size
b=2
# cor da legenda (em ingles, teste ao mudar) | font color
c="yellow"
# cor da borda da legenda (em ingles, teste ao mudar) | font border color
r="black"
# saida da legenda para tela (screen) ou arquivo (file) | defines output to "s"creen or "f"ile
o="file"

# Obtendo valores personalizados | Getting customized settings
while getopts "b:d:f:t:c:r:s:o:" opt; do
  case $opt in
    d) # altera o tempo da legenda na tela | change subtitle screen time
      d="$OPTARG" ;;
    b) # espessura da borda da legenda | sibtitle border thickness
      b="$OPTARG" ;;
    f) # nome do arquivo de legendas | subtitles file name
      f="$OPTARG" ;;
    t) # tamanho da borda | border size
      t="$OPTARG" ;;
    c) # cor da fonte | font color
      c="$OPTARG" ;;
    r) # cor da borda | border color
      r="$OPTARG" ;;
    s) # separador | separador
      s="$OPTARG" ;;
    o) # define saida na tela "screen" ou arquivo "file" | defines output to screen or file
      o="$OPTARG" ;;
  esac
done

trap "rm -f /tmp/mostra_legenda_pipe ; kill -2 $pid 2> /dev/null ; exit" 0 1 2 3 15

#----------------------------------
# Programa principal | Main program
#----------------------------------

if [ "$f" = "" ]; then
  echo
  echo "Uso: $0 [-b <borda>] [-d tempo] -f <arquivo_legendas>"
  echo
  echo "Separacao de idiomas com $s"
  echo "Uma legenda (varios idiomas) por linha"
  echo
  exit
fi

readarray arq < $f
tam=$(wc -l $f | cut -d\  -f 1)

# calculando posicao da linha de baixo | calculating bottom subtitle position
offset=$(expr 5 \* $t)

i=0
rm -f /tmp/mostra_legenda_pipe
mkfifo /tmp/mostra_legenda_pipe

# Aguarda o primeiro comando de disparo de legendas
# Wait first subtitle command shot
cat /tmp/mostra_legenda_pipe > /dev/null

# inicia a gravacao | starts recording
teste="$(\ls meuVideo-*avi 2> /dev/null | tail -1 | sed -e 's/meuVideo-//' -e 's/\.avi//')"
if [ "$teste" = "" ]; then
  num=01
else
  num=`expr $teste + 1 | awk '{printf"%02d",$1}'`
fi
ffmpeg -f x11grab -s 1920x1080 -r 12000/1001 -i :0.0 -q:v 2 meuVideo-$num.avi > /dev/null 2>&1 &
pid="$!"

if [ "$o" = "file" ]; then
  # guardando momento inicial para calcular tempos | saving initial moment to calculate times
  inicio="$( expr $(date +%s) )"
fi

while [ $i -lt $tam ]; do
  # pega texto(s)
  t1="$(echo ${arq[$i]} | awk -F"$s" '{printf"%s",$1}')"
  t2="$(echo ${arq[$i]} | awk -F"$s" '{printf"%s",$2}')"
  # coloca na tela ou no arquivo | draws onscreen or write to file
  if [ "$o" = "screen" ]; then
    (echo "$t2" | osd_cat -A center -d $d -o 10 -f -bitstream-*-*-*-*-*-$t-*-*-*-*-*-iso8859-* -c $c -O $b -u $r) &
    echo "$t1" | osd_cat -A center -p bottom -d $d -o -$offset -f -bitstream-*-*-*-*-*-$t-*-*-*-*-*-iso8859-* -c $c -O $b -u $r
  elif [ "$o" = "file" ]; then
    agora="$(expr $(date +%s) - $inicio )"
    echo $(date +%H:%M:%S,000 --date="@$(expr $agora - 75600)")
    (echo; echo $i; echo "$(date +%H:%M:%S,000 --date="@$(expr $agora - 75600)") --> $(date +%H:%M:%S,000 --date="@$(echo $agora + $d - 75600 | bc)")") | tee -a subtitle1.srt >> subtitle2.srt
    echo "$t1" | tee -a subtitle1.srt
    echo "$t2" >> subtitle2.srt
    sleep $d; echo OK PARA PROXIMA
  fi
  (( i++ ))
  # o "if" eh para pular a ultima espera depois de mostrar a ultima linha
  if [ $i -lt $tam ]; then
    cat /tmp/mostra_legenda_pipe > /dev/null
  fi
done

kill -2 $pid 2> /dev/null

rm -f /tmp/mostra_legenda_pipe

Instruções completas tomando como exemplo um Linux com XFCE:

Veja o tutorial de uso dos scripts em vídeo feito usando ele e os passos descritos acima!

https://www.youtube.com/watch?v=EdJYHQw-VW0

E aqui um tutorial feito com ele. Neste eu coloquei outro atalho de teclado para colocar um fundo preto na tela com o gthumb, fazendo títulos de entrada e saída do vídeo.

https://www.youtube.com/watch?v=OVJ6mGQlIxU