Manual:Grupo de trabajo Sonido
De Hackmeeting
(script graba_z.sh) |
(Refactorizado script de zenity.) |
||
| Línea 47: | Línea 47: | ||
<pre> | <pre> | ||
#!/bin/bash | #!/bin/bash | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | + | usage(){ cat << EOU >&2 | |
| - | + | $0 - Script para la grabación de charlas del hackmeeting | |
| + | Uso: $0 [-s SALA] [-g GENERO] [-a ALBUM] [-c COMENTARIO] -p [PATH] [-r user@host:sharepoint] [-f ARCHIVO_DE_CHARLAS] | ||
| + | -s SALA Sala de la charla | ||
| + | -g GENERO Genero para las tags del archivo de audio | ||
| + | -a ALBUM Albug para las tags del archivo de audio | ||
| + | -c COMENT Comentario para las tags de archivo de audio | ||
| + | -r REMOTE Direccion a la que hacer el SCP del archivo al finalizar | ||
| + | -f FILE Archivo que contiene la relacion de charlas previstas, en formato "CHARLA | PONENTE" | ||
| + | -p PATH Path por defecto donde se guardaran los archivos | ||
| + | EOU | ||
| + | exit | ||
| + | } | ||
| + | debug(){ echo $@ >&2; } | ||
| + | _stop(){ zenity --question --title "Dialogo de confirmacion de cierre" --text="¿Esta seguro que quiere detener la grabacion?" && { pkill arecord; exit; }; } | ||
| + | restart_on_exit(){ (( $1 > 0 )) && { continue; }; } | ||
| - | # | + | main_loop(){ |
| - | # -- | + | debug "[INFO] Starting main loop at $( date )" |
| - | # -- | + | # Me parecia un poco cargante... |
| + | #zenity --info --title="Preparado para iniciar una grabacion"\ | ||
| + | # --text="Presta atencion a las siguientes preguntas" | ||
| - | + | # Los nombre de la charla se toman de $charlas_file | |
| - | + | Charla=`cat ${charlas_file}|tr '|' '\n'| zenity --list --width="600" --height="400" \ | |
| - | # Los nombre de la charla se toman de | + | |
| - | Charla=`cat | + | |
--title="Elija la charla que quiere grabar" \ | --title="Elija la charla que quiere grabar" \ | ||
| + | --text="Elija la charla de la lista inferior"\ | ||
--print-column=ALL \ | --print-column=ALL \ | ||
| - | --column="Charla" --column="Ponente"` | + | --column="Charla" $charlas --column="Ponente"` |
| + | restart_on_exit $? | ||
| - | + | IFS="|"; while read nc np; do | |
| - | + | nombre_charla="${nc}"; nombre_ponente="${np}"; | |
| + | nf_charla=$( tr -d ' ' <<< "$nombre_charla"); | ||
| + | done <<< "${Charla}" | ||
| - | + | debug "[Info] Asking for user confirmation on selecting $nombre_charla" | |
| - | + | zenity --question \ | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | zenity --question \ | + | |
--title="Datos para la grabacion" \ | --title="Datos para la grabacion" \ | ||
| - | --text="Charla: $nombre_charla | + | --ok-label="Continuar" --cancel-label="Seleccionar otra"\ |
| - | + | --text="<b>Charla:</b> $nombre_charla\n<b>Ponente:</b> $nombre_ponente" | |
| - | + | restart_on_exit $? | |
| + | |||
| + | # Nombre de fichero con el path, nombre charla, fecha y sala | ||
| + | filename="${path}${nf_charla}_$(date +%d-%H_%M)_${sala}.ogg" | ||
| + | |||
| + | debug "[INFO] [$filename] Starting record for $filename" | ||
| + | # Grabamos charla con arecord y encodeamos con oggenc | ||
| + | arecord -f cd -t raw | oggenc - -r -o $filename & | ||
| + | |||
| + | # Preguntamos periodicamente si el usuario quiere terminar la grabacion. | ||
| + | # NOTA: Esto puede ser un poco desesperante... | ||
| + | while true; do | ||
| + | debug "[INFO] [$filename] Asking user to stop or continue." | ||
| + | espacio_libre=`df -k $path | awk 'END {print $(NF-2)}'` | ||
| + | ocupa_file=`ls -l $filename| awk '{print $5/1024}'` | ||
| + | |||
| + | zenity --question --title="Grabando..."\ | ||
| + | --ok-label="Detener" --cancel-label="Continuar"\ | ||
| + | --text="<b>Espacio libre:</b> $espacio_libre\n<b>Tamano fichero:</b> $ocupa_file\n"\ | ||
| + | --timeout=10 && _stop | ||
| + | done | ||
| - | # | + | debug "[INFO] [$filename] Etiquetting $filename with $nombre_charla, $album, $genero, $comentario" |
| - | + | # Ponemos etiquetas el fichero ogg | |
| + | lltag --yes -a "$nombre_ponente" -t "$nombre_charla" -A "$album" -g "$genero" -c "$comentario" -d "`date -R`" $filename | ||
| - | # | + | # Copiamos el fichero al servidor de CEB |
| - | + | debug "[INFO] [$filename] [`date -R`] Copiando fichero ${filename} al servidor CEB." | |
| + | scp $filename $remote 2>&1 | ||
| + | } | ||
| - | # | + | # Usage note: it will set defaults, override them on ~/.grabacion_charlas.cfg, override this with ./grabacion_charlas.cfg and then override that with arguments ;) |
| - | + | ||
| - | + | ||
| - | + | # Set defaults. | |
| - | + | sala="SALA_1" | |
| - | + | genero="hacktivismo" | |
| - | + | album="hackmeeting09" | |
| - | + | comentario="http://sindominio.net/hackmeeting" | |
| - | + | path="$HOME/charlas/" | |
| - | + | remote="isaac@ceb:/mnt/farre/CompartirEsBueno/sube/hackmeeting/" | |
| - | + | charlas_file="./charlas.txt"; | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | # | + | # Source conf file |
| - | + | [[ -e ~/.grabacion_charlas.cfg ]] && . ~/.grabacion_charlas.cfg | |
| + | [[ -e grabacion_charlas.cfg ]] && . grabacion_charlas.cfg | ||
| - | # | + | # Get arguments |
| - | + | while getopts "s:g:a:c:r:f:p:h" opt; do | |
| - | + | case $opt in | |
| + | s) sala="$OPTARG" ;; | ||
| + | g) genero="$OPTARG" ;; | ||
| + | a) album="$OPTARG" ;; | ||
| + | c) comentario="$OPTARG" ;; | ||
| + | r) remote="$OPTARG" ;; | ||
| + | f) charlas_file="$OPTARG" ;; | ||
| + | p) path="$OPTARG" ;; | ||
| + | h) usage ;; | ||
| + | [?]) usage ;; | ||
| + | esac | ||
| + | done | ||
| + | [[ ! -e $path ]] && mkdir -p $path; | ||
| + | while true; do main_loop 2>>$path/graba.log; done | ||
| - | |||
</pre> | </pre> | ||
| - | + | Nota de XayOn: Al refactorizar este script he metido cosas en inglés y spanglish, la costumbre, si alguien lo quiere traducir por mi... | |
| + | Hay cosas utiles que se podrian aplicar al script sin interfáz, pero para eso igual haría spam de unas librerias en bash que tengo por ahi pa coloricos y menus varios. | ||
=== graba.sh === | === graba.sh === | ||
Revisión de 02:38 23 sep 2011
Se encarga de coordinar y montar los equipos de sonido
Tabla de contenidos |
Amplificar la voz y el audio de la sala
Para eso vamos a necesitar (por cada sala a no ser que no se hagan simultáneamente y sea posible mover el equipo de sala a sala):
- Un micrófono dinámico por ponente, con su correspondiente pie de mesa o suelo y cable.
- Una mesa de mezlas con entrada de micro y entrada de línea, cómo mínimo.
- Un sistema de amplificación que puede ser:
- Pareja de monitores autoamplificados.
- Un amplificador mas dos pantallas pasivas.
Cableado necesario:
- RCA-RCA
- Canon-Canon (XLR-XLR)
- Canon(XLR)-Jack y viceversa (macho-hembra hembra-macho, nunca se sabe cuando puedes necesitarlo)
- Adaptadores varios: de jack pequeño a grande y viceversa, de jack RCA y viceversa, Canon(XLR)-RCA, etc.
Registrarlo y mandar una señal para el streaming
Registro:
- Se puede utilizar un ordenador conectado a la mesa o a una salida auxiliar del amplificador (asegurarse de que no está amplificada la salida, de lo contrario habrá distorsión), y grabarlo con cualquier aplicación libre ;)
- También sirve, cómo no un grabador Minidisk con entrada line-in
- O un reproductor ogg con line-in
Equipo para el chillout y el escenario
El equipo del chillout normalmente no es muy potente, suele bastar un equipo de hi-fi doméstico. El equipo del escenario (si lo hubiera, claro) ya suele ser más grande, dependiendo de las necesidades y de las posibilidades de conseguirlo. En todo caso, suele ser un equipo que ya consta de su etapa de potencia conectado a su P.A., mesa de directo o de DJ, sus platos si hay que pinchar, etc. Aunque si no se dispone de medios siempre se puede improvisar con el equipo de la ponencia y un mp3 portátil ;)
Como grabar a través de ordenador
La grabación de las charlas durante el hackInvisible (2008) se realizó poniendo un ordenador en cada sala de charlas conectado a la mesa de sonido. Estos ordenadores tenían un sistema preparado por el hackmeeting. Cada ordenador disponía de una Debian (se podría utilizar cualquier otra distribución de GNU/Linux) sin entorno gráfico, con los programas ecasound, lltag, ssh-client y alsa-utils instalados.
En la primera consola (Ctrl-Alt-F1) estaba en ejecución un script de shell (graba.sh) que daba instrucciones al usuario, grababa y tageaba las charlas. Además al terminar cada grabación subía automaticamente las grabaciones a un servidor donde se almacenaban. Para poder subir las charlas el servidor tenía incluidas la clave publica ssh de cada uno de los ordenadores de grabación, con lo que se autentificaban a través de ella.
En la segunda consola (Ctrl-Alt-F2) estaba en ejecución otro script de shell (monitor.sh) que mostraba monitores de volumen de las grabaciones para poder ajustar que se estén grabando bien las charlas.
En la tercera consola (Ctrl-Alt-F3) estaba en ejecución un tercer script (alsamixer.sh) que mantenía todo el rato en ejecución alsamixer, con el que se regulan los volúmenes de grabación.
Además de estos tres scripts se creó un cuarto script (comprueba_charlas.sh) que ejecutábamos manualmente, que permitía comprobar la integridad de las charlas enviadas al servidor. Con el se verificaba que cada charla hubiera llegado integramente al servidor y se había visto dañada por problemas con la red.
Scripts
Todo el código mostrado en esta sección esta bajo la licencia GPLv3[1].
graba_z.sh
Este script utiliza la aplicación gráfica zenity como interfaz con el usuario y se ha usado en el HM 2009
#!/bin/bash
usage(){ cat << EOU >&2
$0 - Script para la grabación de charlas del hackmeeting
Uso: $0 [-s SALA] [-g GENERO] [-a ALBUM] [-c COMENTARIO] -p [PATH] [-r user@host:sharepoint] [-f ARCHIVO_DE_CHARLAS]
-s SALA Sala de la charla
-g GENERO Genero para las tags del archivo de audio
-a ALBUM Albug para las tags del archivo de audio
-c COMENT Comentario para las tags de archivo de audio
-r REMOTE Direccion a la que hacer el SCP del archivo al finalizar
-f FILE Archivo que contiene la relacion de charlas previstas, en formato "CHARLA | PONENTE"
-p PATH Path por defecto donde se guardaran los archivos
EOU
exit
}
debug(){ echo $@ >&2; }
_stop(){ zenity --question --title "Dialogo de confirmacion de cierre" --text="¿Esta seguro que quiere detener la grabacion?" && { pkill arecord; exit; }; }
restart_on_exit(){ (( $1 > 0 )) && { continue; }; }
main_loop(){
debug "[INFO] Starting main loop at $( date )"
# Me parecia un poco cargante...
#zenity --info --title="Preparado para iniciar una grabacion"\
# --text="Presta atencion a las siguientes preguntas"
# Los nombre de la charla se toman de $charlas_file
Charla=`cat ${charlas_file}|tr '|' '\n'| zenity --list --width="600" --height="400" \
--title="Elija la charla que quiere grabar" \
--text="Elija la charla de la lista inferior"\
--print-column=ALL \
--column="Charla" $charlas --column="Ponente"`
restart_on_exit $?
IFS="|"; while read nc np; do
nombre_charla="${nc}"; nombre_ponente="${np}";
nf_charla=$( tr -d ' ' <<< "$nombre_charla");
done <<< "${Charla}"
debug "[Info] Asking for user confirmation on selecting $nombre_charla"
zenity --question \
--title="Datos para la grabacion" \
--ok-label="Continuar" --cancel-label="Seleccionar otra"\
--text="<b>Charla:</b> $nombre_charla\n<b>Ponente:</b> $nombre_ponente"
restart_on_exit $?
# Nombre de fichero con el path, nombre charla, fecha y sala
filename="${path}${nf_charla}_$(date +%d-%H_%M)_${sala}.ogg"
debug "[INFO] [$filename] Starting record for $filename"
# Grabamos charla con arecord y encodeamos con oggenc
arecord -f cd -t raw | oggenc - -r -o $filename &
# Preguntamos periodicamente si el usuario quiere terminar la grabacion.
# NOTA: Esto puede ser un poco desesperante...
while true; do
debug "[INFO] [$filename] Asking user to stop or continue."
espacio_libre=`df -k $path | awk 'END {print $(NF-2)}'`
ocupa_file=`ls -l $filename| awk '{print $5/1024}'`
zenity --question --title="Grabando..."\
--ok-label="Detener" --cancel-label="Continuar"\
--text="<b>Espacio libre:</b> $espacio_libre\n<b>Tamano fichero:</b> $ocupa_file\n"\
--timeout=10 && _stop
done
debug "[INFO] [$filename] Etiquetting $filename with $nombre_charla, $album, $genero, $comentario"
# Ponemos etiquetas el fichero ogg
lltag --yes -a "$nombre_ponente" -t "$nombre_charla" -A "$album" -g "$genero" -c "$comentario" -d "`date -R`" $filename
# Copiamos el fichero al servidor de CEB
debug "[INFO] [$filename] [`date -R`] Copiando fichero ${filename} al servidor CEB."
scp $filename $remote 2>&1
}
# Usage note: it will set defaults, override them on ~/.grabacion_charlas.cfg, override this with ./grabacion_charlas.cfg and then override that with arguments ;)
# Set defaults.
sala="SALA_1"
genero="hacktivismo"
album="hackmeeting09"
comentario="http://sindominio.net/hackmeeting"
path="$HOME/charlas/"
remote="isaac@ceb:/mnt/farre/CompartirEsBueno/sube/hackmeeting/"
charlas_file="./charlas.txt";
# Source conf file
[[ -e ~/.grabacion_charlas.cfg ]] && . ~/.grabacion_charlas.cfg
[[ -e grabacion_charlas.cfg ]] && . grabacion_charlas.cfg
# Get arguments
while getopts "s:g:a:c:r:f:p:h" opt; do
case $opt in
s) sala="$OPTARG" ;;
g) genero="$OPTARG" ;;
a) album="$OPTARG" ;;
c) comentario="$OPTARG" ;;
r) remote="$OPTARG" ;;
f) charlas_file="$OPTARG" ;;
p) path="$OPTARG" ;;
h) usage ;;
[?]) usage ;;
esac
done
[[ ! -e $path ]] && mkdir -p $path;
while true; do main_loop 2>>$path/graba.log; done
Nota de XayOn: Al refactorizar este script he metido cosas en inglés y spanglish, la costumbre, si alguien lo quiere traducir por mi... Hay cosas utiles que se podrian aplicar al script sin interfáz, pero para eso igual haría spam de unas librerias en bash que tengo por ahi pa coloricos y menus varios.
graba.sh
#!/bin/sh
sala="SALA_P"
genero="hacktivismo"
album="hackmeeting09"
comentario="http://sindominio.net/hackmeeting"
path="/home/hm/charlas/"
remote="mediacenter@ceb:/home/ceb/hackmeeting/mediacenter/"
while [ 1 ]
do
clear
echo -e "\n \n AUN NO ESTAS GRABANDO \n \n"
echo -e ""
echo -e ""
echo -e ""
echo -e "\033[0;31m\033[1m============================"
echo "------[graba-o-matic]-------"
echo -e "-------\033[0;32m\033[5mMasMadHack2009\033[25m\033[0;31m\033[1m-------"
echo -e "============================\033[0m"
echo -e "\033[36m-----esta grabacion no tiene "
echo -e "ninguna garantia para ningun "
echo -e "proposito y las ideologas de"
echo -e "la cosa delegan toda respon"
echo -e "sabilidad sobre el padrino"
echo -e "de la charla."
echo -e "With great power comes great"
echo -e "responsibility--------------\033[37m"
echo -e -n "\033[33m\033[1mnombre de la charla:\033[37m\033[22m\n# "
read nombre_charla
echo -e -n "\033[33m\033[1mnombre del ponente:\033[37m\033[22m\n# "
read nombre_ponente
clear
echo -e "\033[42m\033[30m.................Preparado para Grabar Charla"
echo -e "\033[42m\033[30m............................................."
echo -e "\033[42m\033[30m............................................."
echo -e "\033[42m\033[30m.............................................\033[40m"
echo -e "\033[1m\033[33m ---> ALT-F2 : monitorizar volumen"
echo -e " ---> ALT-F3 : modificar el volumen"
echo -e " ---> ALT-F1 : regresar aqui\033[22m\033[37m"
echo -e "\033[41m\033[0;43m *** Importante: controla que el volumen "
echo -e "\033[41m\033[0;43m *** se mantenga en un rango medio \033[40m"
echo ""
echo -e "\033[1m===> ENTER : \033[5mCOMENZAR\033[25m <==="
echo -e "===> CTRL-C: \033[5mTERMINAR\033[25m <===\033[22m"
read
echo -e "\n \n GRABANDO ..... \n \n"
filename=$path`date +%d-%H_%M`_${sala}.ogg
echo -e "-------\033[0;32m\033[5mGRABANDO\033[25m\033[0;31m\033[1m-------"
ecasound -d:0 -i alsa -o $filename
clear
echo -e "\n\nParando... espere por favor."
lltag --yes -a "$nombre_ponente" -t "$nombre_charla" -A "$album" -g "$genero" -c "$comentario" -d "`date -R`" $filename
scp $filename $remote >> /home/hm/charlas/graba.log 2>>/home/hm/charlas/graba.log &
clear
echo -e "\033[1m\033[33mGracias por su ayuda. Que el espiritu de root vaya contigo."
echo -e "\n \n **** GRABACION GRABADA Y ENVIADA CON EXITO AL CENTRO DE MEDIAS **** \n \n \n \n \n"
echo -e "======> PULSA ENTER PARA LA SIGUIENTE GRABACION <======\033[37m\033[22m"
read
done
monitor.sh
#!/bin/sh
while [ 1 ]
do
sleep 1
if [ `pgrep ecasound` ]
then
ecasignalview alsa,default alsa,default
else
clear
echo "Ahora no me apetece..."
fi
done
alsamixer.sh
#!/bin/sh
while [ 1 ]
do
alsamixer -V playback
done
comprueba_charlas.sh
#!/bin/bash -x
for i in `ls /home/hm/charlas/| grep .ogg$`
do
remote_md5=`ssh mediacenter@ceb md5sum $i | awk '{print $1}'`
local_md5=`md5sum /home/hm/charlas/$i |awk '{print $1}'`
[ "X$remote_md5" != "X$local_md5" ] && scp /home/hm/charlas/$i mediacenter@ceb:
done

