2021/03/28

Agujeros analógicos para preservación de webinares.

Los webinars existian desde antes que el covid, pero no les prestaba mucha atención por que prefiero las actividades presenciales. Como el covid prefiere los webinars, en este último año tuve que desarrollar algunos métodos y programas, no sólo para webinars sino para remoto en general, como xzoom y usar dos máquinas a la vez.

Una comodidad que presentan, cuando quedan grabados es poder "asistir" aunque tengas un conflicto horario. A veces se pueden bajar y otras no y el problema es que no me gusta mucho quedar sujeto a la voluntad de quien pueda dejar de publicar la grabación.

Dado que no nos importa mucho la calidad pues lo que nos interesa son los conceptos, vamos a explotar lo que se llama el agujero analógico que básicamente dice algo así como:

No importa cuánto ni cómo intentes proteger un contenido multimedia digital, siempre alguien puede rompértelo con una cámara y un micrófono.

Con respecto a la grabación en vivo es muy sencillo se hace con recordmydesktop, tengo unos scripts facilitadores en github, los que dicen record pero no timer, podés elegir grabar la ventana entera o de un modo un tanto indirecto un área.

El que graba por id de ventana te pide que le señales cuál y lo hace.

El que es por área, determina un área de una ventana de referencia que despues quitás. Es útil para grabar parte de una ventana, como suele ser un proyector.

Uso de máscara para recordmydesktop
Uso de máscara para recordmydesktop


En la imagen podés ver que estoy usando una terminal que tiene transparencia total para poder ver que hay debajo, hace de máscara.

Si los probás un poquito vas a llegar a la conclusión de que en realidad el que graba por área es prescindible, pero sirve para cuando querés tener el comando listo.


Hasta donde yo sé usar recordmydesktop y configurar audio, no he podido que este grabe sólo el audio del video que está grabando y esto es por que no tiene relación con la aplicación a la que está grabando, a tal punto que si le ponés otra ventana encima grabará a ésta última, recordmydesktop interactúa con xwindows y graba todo el audio. Para ello con Linux Mint Mate en Sound Preferences pongo como Input a "Monitor of ...." según a donde esté yendo el audio.

Tendría que explorar pulseaudio o lo que sea que tengas de audio para mejorar este specot o mejor me quedo con mantener la disciplina de no activar ningún otro audio mientras y además recordar no cambiar de desktop ni abrir nada nuevo que pueda aparecer encima de la región grabada.

Queda entonces muy limitada la grabación en vivo haciendo otra cosa, aunque no es imposible.

Ponele que ya tenés tu copia para futura referencia, perfecto, pero había dicho antes que quizás tenías un conflicto horario. Supongamos que estás presente con una compu pero no podés asistir, podrías grabarlo.

Nos queda grabar la grabación, que nos trae otro problema, el de cuándo terminar. Si estamos viendo a la vez o cuidadosamente haciendo otra cosa, vemos que terminó y listo, pero si nos fuimos a hacer otra cosa, va a seguir grabando luego de haber terminado la sesión.

Para esto agrego un nuevo script. Lo que hace es iniciar la grabación y la manda al background. Espera un tiempo determinado y le envía un control-C para que deje de grabar, notá que ahora sabemos cuál es la duración del video pues es una grabación.

Para enviarle el control-C, necesitamos conocer el pid.

La primera tentación se usar 

ps ax | grep recordmydesktop | cut -d" " -f1
3412

pero me ofende, es hora de progresar, usemos 

pidof recordmydesktop
3419

que es lo mismo pero más elegante.

Ambas soluciones tienen un problema, improbable pero posible, que es que haya más de una instancia de recordmydesktop en ejecución y no tenemos manera de saber cuál es la correcta.

Lo podemos arreglar con:

ps | grep recordmydesktop | cut -d" " -f2


  PID TTY          TIME CMD
 3473 pts/22   00:00:00 bash
 3486 pts/22   00:00:00 recordmydesktop
 3507 pts/22   00:00:00 ps
 4993 pts/22   00:00:00 bash

 

Pero ya estamos viendo que ese espacio adelante de ps que no está en ps ax nos va a traer problemas.

Necesitamos obtener el pid del que acabamos de ejecutar.

Como lo ejecutamos con & para mandarlo al background, podemos consultarlo con jobs -p, pero otra vez tenemos el conflicto de que pueden haber más jobs ejecutándose en este mismo proceso, aunque tambien improblable. Vamos a usar éste método quedándonos con el último job:

./script.sh &
jobs -p | tail -1
3491


¿Cómo viene el script?

  • iniciar grabación en background
  • obtener el pid
  • esperar nn segundos

Esto es con sleep segundos, por ejemplo para un video de 44:32:

sleep 2672

y sólo falta mandarle el control-C


 /bin/kill --table
 1 HUP      2 INT     3 QUIT   4 ILL     5 TRAP
 6 ABRT     7 BUS     8 FPE    9 KILL   10 USR1
11 SEGV    12 USR2   13 PIPE  14 ALRM   15 TERM
16 STKFLT  17 CHLD   18 CONT  19 STOP   20 TSTP
21 TTIN    22 TTOU   23 URG   24 XCPU   25 XFSZ
26 VTALRM  27 PROF   28 WINCH 29 POLL   30 PWR
31 SYS
    


Fijate que uso /bin/kill, esta es la versión por id:

TIME=$(( $1 * 60 + $2 ))
echo "Select which window to record"
echo "Press CRTL-C to cancel"
echo
ID=$( xwininfo | grep "Window id" \
               | cut -d : -f 3 | cut -d" " -f 2 )
echo "Recording $1:$2 ($TIME seconds)"
echo "Press CRTL-C to stop recording"
echo -n "Starts in 5 "
sleep 5

recordmydesktop --windowid=$ID &
RMDPID=$( jobs -p | tail -1 )

sleep ${TIME}
/bin/kill -2 ${RMDPID}


Esta por área:


TIME=$(( $1 * 60 + $2 ))
echo "Put a window over the area that you want to record and select it"
echo "Press CRTL-C to cancel"
echo

INFO=$( xwininfo  )

WIDTH=$( echo "$INFO" | grep Width: | cut -d " " -f 4 )
HEIGHT=$( echo "$INFO" | grep Height: \
                       | cut -d " " -f 4 )
X=$( echo "$INFO" | grep "Absolute upper-left X"
                  | cut  -d " " -f 7 )
Y=$( echo "$INFO" | grep "Absolute upper-left Y"
                  | cut  -d " " -f 7 )
echo "Recording $1:$2 ($TIME seconds)"
echo "Press CRTL-C to stop recording"
echo -n "Starts in 5 "
sleep 5

recordmydesktop -x "$X" -y "$Y" --width "$WIDTH" \
                --height "$HEIGHT" &
RMDPID=$( jobs -p | tail -1 )

sleep ${TIME}
/bin/kill -2 ${RMDPID}

 

No te olvides de desactivar el screensaver o al menos darle un tiempo tal que no se active antes de tiempo.


Todo  en github.

Esto no termina...


 

 




No hay comentarios:

Publicar un comentario