Simple Screen Recorder, grabación de Escritorio y Vídeo Streaming

Simple Screen Recorder es una fantástica aplicación que permite la grabación de lo que sucede en el escritorio, pero no solo eso, también puede utilizarse para el vídeo streaming por ejemplo en youtube.

En su página web encontraras las instrucciones para instalarlo en diferentes distribuciones Arch Linux, Debian, Fedora, Gentoo, KaOS, Mageia, NixOS, OpenSUSE, Red Had Enterprise, CentOS, Scientific Linux, Slackware, Ubuntu y derivados ( Linux Mint) y Otros.







Una configuración ejemplo sería:

Grabar pantalla completa, tasa de fotogramas 30, grabar cursor, y la fuente de audio, en mi caso utilizo Jack, y si no preciso grabar el audio del micrófono, Record System Speakers

En la siguiente pantalla el tipo de grabación que es muy configurable, mi preferida es contenedor Matroska, codec de video H.264, rate 23, preset ultrafast y el codec de audio sin comprimir.
La elección de estos parámetros es que lo que me interesa es grabar con la mayor calidad posible, aunque el vídeo ocupe más espacio, pero  con el menor consumo de cpu posible, hay que tener en cuenta que en función de lo que estemos haciendo, ya estamos haciendo consumo de cpu.


Una vez que hallamos terminado la grabación, podremos convertirlo a un formato que ocupe menos espacio para alojarlo por ejemplo en youtube, para ese proceso podremos utilizar ffmpeg, por ejemplo

ffmpeg -i Escritorio.mkv -c:v copy -c:a libfdk_aac -b:a 384k output.mp4

 o esta si no tenemos instalado el codec libfdk_acc

 ffmpeg -i Escritorio.mkv -c:v copy -c:a aac -b:a 384k output.mp4

 este formato es el aconsejado por youtube, en el caso de que la calidad del audio del vídeo no sea muy necesaria cambiarlo a 128k.


 En la pantalla final podremos iniciar, pausar, finalizar o guardar la grabación.

 En el siguiente post detallaremos como configurar Simple Screen Recorder para hacer Vídeo Streaming en Youtube, de una manera sencilla y con poco consumo de recursos.

Tutorial FoxDot 2

Segundo Minitutorial sobre FoxDot, esta vez estreno de subtítulos para mejor comprensión y inclusión de marca de agua del canal


Etiquetas pre y code, propiedad overflow en post blogger

Uno de los problemas al que solemos enfrentarnos cuando en un post de blogger incluimos un fragmento de código de algún lenguaje de programación, es la dificultad de incluir tabulaciones o espacios, que hagan más legible el código mostrado. Si el lenguaje además es sensible a las indentaciones, como por ejemplo Python, buscar una solución al mismo es necesaria.

 Para resolver este problema, hago uso de las etiquetas <pre><code>, por ese orden en las que encierro el código que previamente he escrito en mi editor favorito, cada uno tiene el o los suyos, encerrándolo a continuación con </code></pre>. De esta manera el código es mostrado tal y como lo hemos escrito, e incluso puede ser copiado para ser ejecutado sin la menor complicación.

 Pero si se accede al post desde otros dispositivos diferentes a un ordenador, como pueden ser una tablet o un teléfono móvil, es corriente que el texto formateado, no se visualice correctamente. Hay entra en juego el uso de la propiedad Css overflow.

La overflow especifica si se debe recortar el contenido o agregar barras de desplazamiento cuando el contenido de un elemento es demasiado grande para caber en el área especificada y tiene los valores siguientes:

visible - El desbordamiento no está recortado. El contenido se representa fuera del cuadro del elemento. Default
hidden - El desbordamiento se recorta y el resto del contenido será invisible.
scroll - El desbordamiento se recorta y se agrega una barra de desplazamiento para ver el resto del contenido
auto- Similar a scroll, pero agrega barras de desplazamiento solo cuando es necesario

A continuación ejemplo de código para solucionar lo anteriormente expuesto

<style>
 .myo {
    margin: .5em 0 1.5em;
    border-bottom: 1px dotted #333333;
    padding-bottom: 1.5em;
    width: 100%;
    overflow: auto;
    }
</style>
<div class='myo>
<pre>
<code>
Este es el código
    que tiene indentaciones
    esta es igual
        y esta es una mayor que las dos anteriores

Fin del código
</code>
</pre>
</div>

Incrustar Subtítulos en vídeos II

En el anterior articulo escribí sobre Autosub y Ffmpeg, y como utilizarlas para incrustar subtítulos en videos. Mientras que la primera esta diseñada en exclusiva para crear archivos de texto con la transcripción de los diálogos de los vídeos, la segunda Ffmpeg es una colección muy completa de software libre que puede grabar, convertir (descodificar) y hacer streaming de audio y vídeo.

FFmpeg es una solución completa para grabar, convertir, editar y transmitir audio y video. Es un software de video de línea de comandos para Windows, Mac y Linux. Admite la conversión entre la mayoría de los formatos de video y audio. Admite la captura y codificación en tiempo real desde medios de transmisión, tarjetas de captura, etc. Pistas de video y audio multiplex (join) y demultipex (split) de todos los formatos de video. Editar (cortar, unir) todos los formatos de video. Filtros avanzados de video y audio. Soporte de subtítulos También se incluyen ffplay (reproductor de video básico) y ffprobe (identificador de video). Varios frontEnds / GUI están disponibles como WinFF , Avanti .

 En esta segunda parte veremos la instrucción necesaria para hacer que ffmpeg incruste subtítulos con un formato diferente en cuanto al tamaño de la fuente, como al color de la misma.

 ffmpeg -i video.in -vf "subtitles=archivo.srt:force_style='PrimaryColour=&H8800FFAF, FontSize=48'" -preset ultrafast video.video.out

 Siendo video.in el archivo de video de entrada, video.out el archivo de video que contendrá los subtítulos, archivo.str el archivo con los subtítulos a incrustar. Con FontSize determinamos el tamaño de la fuente y ahora nos centraremos en PrimaryColour el valor &H es común para cualquier valor, 88 es el código hexadecimal para determinar la transparencia, y los seis siguientes es el codigo de color pero con la particularidad de que esta escrito al revés de como solemos utilizarlo, por ejemplo para un color rojo y una transparencia mediante el código seria 0000FF, resultando que habría que escribir &H800000FF, 80 la transparencia media y 0000FF.

 En cuanto a las fuentes de las letras, el asunto se torna más complejo y dependerá mucho de las que tengamos instaladas y de la que sea la utilizada por defecto en nuestro sistema.

 He escrito un script en python que genera un archivo de texto para poder usarlo como subtítulos. A tener en cuenta que la duración de los subtítulos ha de ser menor que el del vídeo, pudiendo ser usado con fines divulgativos o de ocio. En el script he configurado la duración de cada subtitulo en 5 segundos.   El código del script es :



#!/usr/bin/env python3

# Crono recibe segundos muestra horas, minutos, segundos en formato 00:00:00
# Horas y Minutos son numeros enteros, posteriormente convertidos a strings
# En caso de len = 1, se antepone 0 para formato 00
def crono(v):
 horas=int(v/3600)
 minutos=int((v-(horas*3600))/60)
 segundos=v-(horas*3600+minutos*60)
 horas=str(horas)
 minutos=str(minutos)
 segundos=str(segundos)
 if (len(horas))==1:
  horas='0'+horas
 if (len(minutos))==1:
  minutos='0'+minutos
 if (len(segundos))==1:
  segundos='0'+segundos
 display =horas+':'+minutos+':'+segundos+',00' 
 return display 

# vtiempo determina la duración del subtitulo, en este caso 5 segundos (en el bucle for)
vtiempo = 0 


# Texto que incluiremos para crear los subtitulos, que separamos con /
texto='Una linea de texto / otra linea de texto / otra linea de texto /
 otra linea de texto / otra linea de texto / otra linea de texto /'
subtitulos=texto.split('/')

# Abrimos el archivo modo escritura, escribimos numero subtitulo,
# comienzo y fin del subtitulo y texto del mismo
archivo = open('carta.srt','w')
for i in range(len(subtitulos)):
 linea1=str(i)+'\n'
 linea2=crono(vtiempo)+' --> '+crono(vtiempo+5)+'\n'
 archivo.write(linea1)
 archivo.write(linea2)
 archivo.write(subtitulos[vsubtitulo]+'\n'+'\n')
 vtiempo +=5

# Cerramos el Archivo 
archivo.close()

Incrustar subtitulos en videos

Buscando aplicaciones que me puedan servir para incrustar subtítulos en videos, he encontrado autosub.

Autosub es una utilidad escrita en python, para el reconocimiento automático de voz y la generación de subtítulos. Toma un video o un archivo de audio como entrada, y genera un archivo de texto con la transcripción, por defecto con la extensión srt, que en un proceso posterior se puede incrustar por ejemplo al archivo de video origen.

Su uso para el Castellano no necesita más requisitos, pero si se desea crear subtítulos traduciendo del idioma original del video a otro idioma, precisa una key de Google Web Speech para generar transcripciones y es más complicado.

Pero si solo lo utilizamos para generar subtítulos en nuestro idioma, el proceso no presenta ninguna complicación, solo se precisa ejecutar por linea de comandos

autosub nombre_archivo -S es -D es

siendo es(Español) el idioma tanto de entrada como salida

El archivo con extensión srt, es en texto plano y por defecto se guarda en el mismo directorio que este activo, el formato es similar a este

1
00:00:03,256 --> 00:00:8,12
Este es el primer subtitulo

2
00:00:10,42 --> 00:00:15,15
Este es el segundo subtitulo

Para instalar autosub es preciso ffmpeg, y posteriormente  instalar Autosub mediante pip install autosub, es decir en python2, no python3. Mas información en Autosub

Posteriormente usaremos ffmpeg para incrustar los subtítulos al video origen, generándose uno nuevo en el que estarán los subtítulos.

La instrucción para ese proceso también se realiza mediante la linea de comandos

ffmpeg -i video.in -vf subtitles=subtítulos.srt video.out

Siendo video.in el video origen, subtítulos.srt el nombre del archivo de texto en el que se encuentran los subtítulos y video.out el nombre del video que tendrá incrustados los subtítulos

Tutorial Básico FoxDot # 3

En los dos artículos anteriores olvidé comentar como se ejecutan las instrucciones y como se paran, para ejecutar una instrucción hay utilizar la combinación de teclas Control y la tecla Enter a la vez, mientras que para finalizar todas las instrucciones que se estén ejecutando en ese momento, se utiliza la combinación de teclas Control y la tecla Punto. Una instrucción seria por ejemplo

p1 >> play('X-o-')

y para hacer que se ejecute y comience a sonar, o deje de sonar, el cursor ha de estar en la linea en la que se encuentra,utilizando las combinaciones de teclas en el párrafo anterior.

Las instrucciones que siguen a continuación, detienen o hacen que solo suene, un player concreto.

p1 >> play('X-o-').stop()
p1 >> play('X-o-').solo()

Ahora abordaremos como lograr que la duración o sample por ejemplo, no sea el mismo para todos los sonidos del player. Pongamos como ejemplo

p1 >> play('X--o--')

porque lo que deseamos es que X y o, se ejecuten cada un tiempo, mientras que los guiones (-), deseamos que se ejecuten cada medio tiempo.

p1 >> play('X--o--', dur=[1,1/2,1/2,1,1/2,1/2])

Esa extraña expresión [1,1/2,1/2,1,1/2,1/2], es una lista, que es una clase de variable, que contiene varios datos. Una variable es un espacio de memoria en la que se almacenan datos, por ejemplo t=1, y si escribimos dur=t, se entiende que la duración sera de 1 tiempo, en el caso de esa lista, la duración será 1,1/2,1/2,1...y así sucesivamente.

Esa lista puede también ser definida en otra linea, para que el entorno sepa que existe y de esta manera utilizarla en diferentes players y también ha de ser ejecutada con la combinación de teclas Control + Enter.

En el caso de que existan varias lineas seguidas, al ejecutar una de ellas se ejecutan las demás.

lista = [1,1/2,1/2,1,1/2,1/2]
p1 >> play('X--o--', dur=lista)
p2 >> play('psspss', dur=lista)

var([1,1/2],[1,2]), es un tipo de variable que en este caso ofrece el mismo resultado que la antes citada [1,1/2,1/2,1,1/2,1/2]), y también se puede definir en una linea aparte o en un player

lista = var([1,1/2],[1,2])
p1 >> play('psspss', dur=lista)

Los parámetros amp, pan, sample y rate, también pueden hacer uso de las variables antes descritas, adecuadas a los valores que les sean propios.

p1 >> play ('X-o-', dur=[1,1/2],amp=[0.7,1], pan=[-1,1],sample=[0,1,0,1])

Tutorial Básico FoxDot # 2

En esta segunda entrega trataremos sobre tres parámetros comunes al objeto play() que vimos en el articulo anterior, y a otros objetos como por ejemplo pluck() o bass(), tanto estos dos como otros objetos, no son más que el nombre que reciben los diferentes sintetizadores preinstalados en FoxDot.
Estos parámetros comunes son dur, amp y pan, y se establecen, cuando volverá a sonar el sample o nota (dur), el volumen (amp) y la distribución en el panorama estéreo (pan).

Todos ellos tienen valores por defecto que suelen ser 1 para dur y amp, 0 para pan. La instrucción

p1 >> play('X-o-', dur=1/2, amp=0.5, pan= -1)

determina que la duración será de medio tiempo, una volumen de la mitad del preestablecido ( no todos los samples o instrumentos tiene la misma percepción sonora), y se escuchara totalmente por el canal izquierdo de altavoces o auriculares, siendo el valor pan=1 el que determina que solo se escuche por el canal derecho.

En cuanto al tiempo y la duración de los sonidos o notas, por defecto esta configurado a 120 bpm, esto es 120 golpes o negras por minuto, por lo que una negra tiene una duración de 1/2 segundo. Se puede variar la configuración relativa al tiempo mediante la instrucción

Clock.bpm = 136

En este caso en un minuto sonarían 136 golpes o negras, la configuración por defecto es

Clock.bpm = 120

Hay dos parámetros más que determinan el sonido de los samples, rate y sample, del parámetro sample hablamos ya en el articulo anterior, comentamos que determina cual de los samples incluidos en la carpeta suena.

El parámetro rate lo que determina es la velocidad a la que se reproducirá el sample, siendo la velocidad o rate predefinido el 1, el 2 seria el doble de velocidad, el 3 el triple. Esa velocidad hace que varíe el timbre del sonido y lo haga más agudo si se emplean valores mayores que 1, o más graves si se utilizan valores decimales como 0.7 o 0.3. Si escribimos un valor negativo el sample se reproduce de atrás hacia adelante.

p1 >> play('X-o-', dur =1/2, amp=0.6, pan=-0.8, sample=2, rate=2)

En mi canal de Youtube este vídeo muestra los ejemplos de este articulo y el anterior.

Tutorial Básico FoxDot # 1

FoxDot utiliza el objeto play para reproducir los samples que se encuentran ubicados por defecto en la carpeta snd, dispuestos de la siguiente manera. Dentro de ella a su vez hay una serie de subcarpetas,( -a,b.....z), que a su vez contienen dos subcarpetas ( minúsculas y mayúsculas en ingles, y es en ellas en la que se encuentran los sonidos sampleados.
El funcionamiento del objeto play para hacer sonar un sonido es el que sigue, pongamos por ejemplo la instrucción

p1 >> play('X').

p1 es el nombre de la pista, play es el instrumento, en este caso el sampleador, que entra en la carpeta X (Mayúscula), y hace sonar el primer sample que encuentra en esa carpeta. Menos alguna carpeta, creo que solo una, todas las carpetas contiene más de un sonido, y se puede escoger sonar uno de los incluidos en la carpeta añadiendo la instrucción sample=numero_sample,

p1 >> play('X',sample=1)

haría sonar el sample segundo de la carpeta, esto es debido a que normalmente en informática el primer numero de una lista de elementos suele ser el 0, el segundo el 1, el tercero el 2, y así sucesivamente.
Pero que sucede si por error indicamos un numero mayor que el de samples que hay en una carpeta, por ejemplo sample=69 cuando solo hay 5 samples, pues no pasa nada anómalo, cuando llega al ultimo sample, sigue contando hasta 100 comenzado de nuevo por el primer sample de la lista, como os supongo curiosos os sacaré de dudas, el sample 69 de esa carpeta ejemplo que tiene 5 samples, recordemos del 0 al 4, seria el sample 3, esto es el cuarto de la carpeta.
La instrucciones play puede contener más referencias a samples que sonaran uno detrás de otro,

p1 >> play('X---')

hace sonar el sample numero 0 de la carpeta X mayúscula y a continuación tres veces el sample 0 de la carpeta - (guion). La sintaxis del instrumento play es play(), y se encierra entre comillas, simples o dobles, los samples que se desean hacer sonar

p1 >> play('X-o-').

Sobre FoxDot

En los últimos tres post, he enlazado con mi canal de youtube dedicado al live coding, en los tres he utilizado FoxDot que es un entorno para codificar en directo. En este enlace podéis encontrar las instrucciones para descargarlo y configurarlo en función de la plataforma que uséis, bien sea Windows, Mac Os, o Linux, como es mi caso.
No es mi primera experiencia en el uso de entornos dedicados al Live Coding, he usado también Tidal Cycles ( poco ), Sonic Pi ( bastante ), pero finalmente he optado por centrarme en FoxDot.
De FoxDot me gusta la sencillez del código utilizado para hacer sonar los samples o los sintetizadores preestablecidos.
Añadir nuevos sintetizadores es relativamente sencillo, y la conexión con sintetizadores externos vía midi y su sincronización con los diferentes 'players', así se denominan las diferentes pistas o instrumentos que suenan, también.



Imagen: La Live Coder Jessica Garson utilizando FoxDot

Live Coding 3

En esta ocasión, retomo el live coding puro, o casi, ya que utilizo algunas funciones que previamente he creado, de esta manera el tiempo hasta que comienzan a suceder cosas interesantes, se acorta.

He utilizado además el sintetizador por software ZynAddSubFX, que me gusta mucho.

Live coding 2 con FoxDot

Este segundo vídeo del canal dedicado al Live Coding es más corto, grabar y mostrar los procesos realizados desde cero aunque es interesante como muestra de los mismos, por otra parte hace que por ello la duración del vídeo se alargue.

En esta ocasión he optado por grabar solo la parte final, una vez realizado los procesos previos.

Primer live coding con FoxDot

Este es el primer vídeo del Canal que versará sobre Live Coding.

Herramientas utilizadas FoxDot, biblioteca Python fácil de usar que crea un entorno de programación interactivo y se comunica con el potente motor de síntesis de sonido SuperCollider

. Al ser Live Coding y grabado en directo hasta el minuto 1:02 aproximadamente no comienza a haber sonido

La Luna Llena del 1 de Agosto

 El martes día uno hay luna llena y un buen momento para realizar el estudio que se indica en el siguiente enlace  Cristales No Empañados Al...