lunes, 25 de enero de 2016

Aprendiendo informatica: Solucionando problemas con mis subtitulos

Ayer me comentaba Noemi Martin (a quien mando un saludo) que tenia un problema con el tamaño de los subtitulos en su televisor. Aunque yo intento ajustar los tamaños de la mejor manera posible no siempre quedan del tamaño mas adecuado al que ofrece un dispositivo en concreto. Tambien existe la posibilidad de que el reproductor que useis no lea el formato en que creo mis subtitulos. Vamos a solucionar ambos problemas.

Para editar los subtitulos yo uso un programa llamado Aegisub, que dispone de versiones para Windows (tambien portable), Mac y Linux y que podeis encontrar en http://www.aegisub.org/ o en vuestros repositorios. No voy a explicar los detalles de funcionamiento del programa, solo lo necesario para que podais editar los subtitulos a vuestro gusto.

El primer paso es abrir los subtitulos con el programa. Muy posiblemente os preguntará si quereis abrir los archivos asociados (en algunos archivos lo elimino). En el caso de que tengais el video en el mismo directorio lo abrira sin problemas, pero en el caso de que no este disponible os mostrará un error. En ese caso, o en el caso de que le indiqueis que no deseais abrirlo debereis arrastrar el archivo de video a la ventana del programa. Hecho esto, empezará a generar cierta información sobre el audio y en un minuto o dos aproximadamente tendreis el archivo completamente abierto, quedando asi la ventana (salvo un detallito o dos que he personalizado):



Podeis ver el video con los subtitulos superpuestos. Ahora podremos editar el estilo del subtitulo. Para ello vamos a Subtitulo->Administrador de estilos y nos aparecerá la siguiente ventana:



En la ventana hay dos zonas diferenciadas. En el area izquierda (Almacen) es donde los traductores pueden guardar los perfiles que mas utilizan (por ejemplo, si quieren asignar a cada protagonista un color a lo largo de una serie para no tener que volver a configurar la informacion cada vez). En el lado derecho (Secuencia actual) podemos ver los estilos que hay en este archivo de subtitulos. Por lo general solo suelo usar un unico estilo, que es el que tiene como nombre "Default". Lo marcamos y presionamos "Editar".



En esta pantalla escogeremos la forma en que queremos que se vea el subtitulo. Podemos cambiar el tipo de letra por una que nos guste mas (esto no lo recomiendo, puesto que no todos los dispositivos tienen los mismos tipos de letra instalados), el color, el tamaño, la posicion del subtitulo, si queremos que tenga un borde mayor o menor. Despues de realizar los cambios podemos presionar en Aplicar para verlos en accion y cuando esté listo presionamos en Aceptar. Una vez realizados los cambios, si prevemos que vamos a usar esta modificacion con frecuencia podemos copiarla al almacén. Recomiendo cambiar antes el nombre al estilo Default que hay en el almacén, por si acaso es necesario reutilizarlo, aunque esto es decision vuestra. Cuando hayamos terminado, vamos a Archivo->Guardar subtitulos para que queden almacenados los cambios.

Con esos cambios solucionamos el problema del tamaño o del color, pero ¿que hacemos si nuestro programa o dispositivo no leen el formato en que publico los subtitulos (ASS). Podemos entonces convertirlos a otros formatos mas habituales, como SRT. Tened en cuenta que el formato SRT no soporta estilos, con lo que el tamaño dependerá de la configuracion de vuestro reproductor, y que es posible que aparezcan simbolos raros o lineas movidas.

Para guardarlo en formato SRT, vamos a Archivo->Exportar subtitulos. Nos aparecerá la siguiente ventana:



Alli no tendremos que tocar nada en un principio. Si vemos mas adelante que hay problemas con las letras acentuadas habra que cambiar la codificacion (abriendo el archivo con el bloc de notas y guardandolo en formato ANSI, por ejemplo), pero por lo general no será necesario. Presionamos ahora "Exportar".



Marcamos como tipo "SubRip (*.srt)" y le ponemos un nombre adecuado. Tenemos que tener cuidado de no presionar sobre el archivo original o le pondremos un nombre incorrecto. Una vez aceptemos, tendremos nuestro subtitulo en formato SRT disponible para ser disfrutado.

Espero haber solucionado los posibles problemas. Un saludo.

domingo, 17 de enero de 2016

Aprendiendo informática: Recortar un video con Avidemux

Hoy voy a mostrar una variacion del post anterior. Poco despues de haber publicado como recortar el minuto de video con VirtualDub recorde que la persona que me pidio el tutorial no utiliza Windows. Esto en realidad no es un grave problema, mas alla de que hay que usar otro programa.

El programa que usaré se llama Avidemux (http://avidemux.sourceforge.net/), y está disponible para Windows, Mac y Linux, que es el sistema que usaré para hacer mi tutorial. Podeis descargarlo desde el enlace anterior o buscarlo en el repositorio de vuestra distribucion como he hecho yo.

Ya para empezar nos ofrece una ventaja, no requiere que usemos archivos .avi, sino que soporta .mp4 y .mkv.

Voy a cargar el video que use en la version anterior, esta vez en mp4, y vamos a analizar un poco la ventana.

Yo me he encontrado con dos problemas. El primero, me indica que hay un fallo en la codificacion, dado que usa B-Frames (no voy a explicarlo otra vez), y el segundo, que ante un video grande tiende a ampliar la pantalla. Seleccionare la opcion de "usar modo seguro" y "Ver->Zoom 1:2".


Podemos ver que algunas opciones son mas simples, toda la parte de codificacion la encontramos en el lado izquierdo, junto con los filtros. En cambio, la barra inferior es mas liosa.

Encontramos la barra deslizante en la que podemos ver la parte del video en la que estamos, flanqueada por dos simbolos de corchete [ ], que nos indican el principio y el final de la seleccion. Al fondo un boton al que, francamente, no le veo utilidad. Se arrastra a izquierda y derecha y mueve la barra deslizante.

Los siguientes botones son Play/Pause, Stop, ir al anterior/siguiente frame, ir al anterior/siguiente keyframe (los botones de las llaves de VirtualDub), inicio y fin de seleccion, anterior y siguiente imagen negra (¿equivale al cambio de escena?) y por ultimo ir al principio y al final del video. Por ultimo, dos botones al fondo para ir al frame que hay al principio y al final de la seleccion.

En la linea inferior podemos ir al frame correspondiente o al instante de tiempo que nos interese. Hare la prueba. Si mal no recuerdo, en mi ejemplo anterior cogi el minuto inmediatamente posterior al frame 2167. Solo tengo que teclearlo en el cuadro correspondiente y presionar intro.

Una vez hecho eso, marco con el boton de fin de seleccion ese area y de nuevo puedo usar Editar->Borrar o presionar SUPR.

Para seleccionar el instante de tiempo, debemos ir a "Ir->Saltar a tiempo". Podemos estar tentados de escribirlo en la parte inferior, pero es facil que acabemos presionando SUPR por error, aparte de que no nos desplazará salvo que haya un frame en ese mismo milisegundo. En mi video hay un frame en 00:01:00:018 y el anterior esta en 00:00:59.976, con lo que no me puede desplazar alli directamente.

Repito el paso anterior, marcando el punto de inicio y como final el final del video y ya tengo el minuto que quiero mantener.

Ahora, la parte final, mantener el video y quitar el audio. Como podeis ver, la opcion a la izquierda en la seccion "Video" pone "Copiar". Esa opcion equivale al "Direct Stream Copy". En cuanto al audio, para eliminarlo, presiono sobre el menu "Audio->Canal principal de audio" y en la ventana que aparece sustituyo en la seccion "Origen de audio" la opcion "Video" por "Ninguno".

Por ultimo, dado que quiero generar un archivo .avi y que no hay que hacer recodificacion alguna solo debo ir a "Archivo->Guardar" y ponerle el nombre que desee. Compruebo el video y funciona correctamente, incluso es mas rapido habiendolo hecho en una maquina virtual que cuando lo hice con VirtualDub.

El sistema ya hemos visto que es muy parecido, y en muchos aspectos Avidemux es mas facil de usar que VirtualDub. Sin embargo, VirtualDub tiene a mi entender mas flexibilidad con los filtros, con los codecs y encuentras mas documentacion en Internet sobre su uso.

Por mi parte creo que eso es todo. Si teneis alguna duda, podeis consultarla.

viernes, 15 de enero de 2016

Aprendiendo informática: Recortar un video con VirtualDub

Ayer me hacian una consulta: ¿como puedo extraer un minuto de un video (supongo que para hacer un gif o algo parecido)? En realidad es algo bastante sencillo, y que usando VirtualDub tarda mas o menos el mismo tiempo.

Para no extenderme, os recuerdo que mencione el VirtualDub/VirtualDubMod/NanDub (cualquiera de los tres os funcionará) en los dos primeros posts sobre eliminar hardsubs (http://acerswap-recovery.blogspot.com.es/2015/12/aprendiendo-informatica-eliminar.htmlhttp://acerswap-recovery.blogspot.com.es/2015/12/aprendiendo-informatica-eliminar_24.html), con lo que solo tendreis que leer/releer esos posts para conocer el funcionamiento basico.

Vamos a ponernos ahora manos a la obra. Se trata de coger un video, recortar el trozo anterior a lo que queremos mantener y luego recortar el trozo que va despues de lo que queremos mantener.

Comenzaremos cargando el video que queremos manipular. En mi caso, lo hare con VirtualDubMod.

Como ya sabreis si usais este programa, podeis encontraros con el problema de la siguiente imagen. Dado que voy a quitar el audio, voy a ignorarlo. Seleccione una u otra opcion, me da lo mismo.



Nuestro siguiente paso es acomodar el programa a nuestro gusto. Mi recomendacion, que hagais un zoom en la imagen del video original para que cubra la pantalla lo mas ajustado posible y que le pongais un tamaño pequeño al video de salida, puesto que no lo usaremos para nada.



En la imagen vemos varios bloques de botones del programa. Estos nos permitiran movernos por el video, pausarlo y seleccionar. Son los que usaremos ahora.

Lo primero que deberemos hacer es localizar la escena a partir de la que queremos trabajar. Para eso se puede usar la barra de desplazamiento que hay encima de la botonera. Hecho esto buscaremos el keyframe mas cercano. ¿Veis esos botones con una llave debajo? Como recordareis, un keyframe es una imagen completa del video, y por tanto a partir de la cual se generaran los frames posteriores. Entonces, la calidad del fragmento se verá maximizada si empezamos a procesar desde un keyframe. Si lo hacemos a partir de un frame predictivo, es posible que aparezcan imagenes pixeladas al principio. Obviamente, solo lo haremos si es posible.


Localizado el punto desde el que editaremos el video presionaremos el ultimo boton de la barra. Nos aparecerá una marca en la barra de desplazamiento.



Esa marca indica que es el final de la seleccion. Ahora volveremos al comienzo del video presionando el cuarto boton de la botonera, y haremos lo propio con el penultimo boton. Esto nos mostrara lo siguiente en pantalla:


Nos aparecerá seleccionada la parte que queremos eliminar. Podeis observar las marcas negras en la barra de desplazamiento.

Ahora presionamos Supr o vamos a Edit->Delete. Eso eliminará el fragmento de video seleccionado. En realidad el anterior paso, el de volver al principio y seleccionar, es innecesario ya que eliminaria ese fragmento independientemente de si hemos marcado el comienzo. En cualquier caso, mejor hacer las cosas bien hechas que no tener que recomenzar el trabajo.

Una vez eliminado, la barra de desplazamiento cambiará para mostrarnos que estamos al principio del video. Ahora vamos a buscar el punto de final al que queremos ir. Dado que pretendemos quedarnos con un unico minuto del video buscaremos el frame correspondiente especificandolo. Vamos al menú Edit de nuevo y ahi a la opcion "Go to...". Nos aparecerá este cuadro:


Marcaremos ahi la opcion "Jump to frame at time:". En el cuadro de texto deberemos poner el punto al que queremos acceder. Viene en formato MM:SS.mmm (minutos, segundos y milesimas de segundo), con lo que si queremos desplazarnos al primer minuto, marcaremos 1:00.000 y al presionar OK saltaremos a la posicion correspondiente del video. Despues haremos lo mismo que hicimos para seleccionar el primer bloque, pero a la inversa. Marcaremos con el boton de inicio de la seleccion, iremos al final del video y marcaremos el final de la seleccion. En este caso hay que hacerlo obligatoriamente, ya que si no lo hicieramos asi podriamos eliminar una parte equivocada.


De nuevo, eliminaremos la parte seleccionada, dejando unicamente el fragmento de video que queremos conservar. Es posible que queden unas pocas milesimas sin grabar. Es un error que no tiene importancia.

Nuestros siguientes pasos estan destinados a grabar ese video. Iremos al menu Video y, dado que no queremos recodificar el video ni agregarle filtros ni nada parecido seleccionaremos la opcion "Direct Stream Copy". Esa opcion nos permite recortar el video sin procesar.

Para eliminar el audio, depende del editor que estemos usando. Si usamos VirtualDub, nos aparecera una opcion similar a la de Video. Si usamos VirtualDubMod, tendremos un menu llamado Streams. Presionamos en "Stream list" y nos aparecerán todas las pistas disponibles que no pertenezcan al video. Esas pistas pueden contener audio o incluso subtitulos. Si bien el estandar .avi no admite ni videos multiaudio ni subtitulos, los reproductores actuales permiten su uso. Seleccionaremos entonces la pista de audio existente para luego dar a "Disable" para desactivarla.


Ahora solo nos queda aceptar en esa ventana, ir a "File->Save as..." y poner un nombre distinto al video original para no sobreescribirlo por accidente. En mi ejemplo ha tardado 4 segundos en realizar el proceso de recorte. Es de esperar que para otros videos ocurra lo mismo.

Espero que haya sido util. Si teneis algun problema solo teneis que indicarlo en los comentarios. Un saludo.

jueves, 14 de enero de 2016

Predescarga de nuevos proyectos

En poco menos de un mes planeo comenzar nuevos proyectos y necesito que me ayudeis a distribuir las RAWs correspondientes. Eso permitira que podais tenerlas disponibles para cuando salgan los subtitulos y facilitara la descarga a otras personas que quieran seguir la serie tambien.

¿Que debeis hacer? Yo os proporcionaré un archivo torrent para que podais descargar el batch correspondiente. Por vuestra parte, necesitare que mantengais compartiendo la serie durante un periodo de tiempo lo mas largo que os sea posible para que haya suficientes semillas.

Proyecto "Keibuho Sugiyama Shintaro" (#KSSSubEsp): http://torcache.net/torrent/C8D1C119E6CCC536E034C0333E42CDDF1683AA09.torrent o https://app.box.com/s/nds6ipwel4sok3btrd7g0jg39n08k9zh

Proyecto "Shomuni temporada 2" (#Shomuni2SubEsp)http://torcache.net/torrent/352E16FB77BF12BD485E96BC84BCD5C938102D59.torrent

NOTA: Necesito especialmente que me ayudeis con el proyecto de Keibuho Sugiyama Shintaro, ya que no se trata de un torrent existente sino de uno que acabo de crear y por tanto no tiene semillas. Si quereis descargarlo por descarga directa para poder ayudarme mas rapidamente, podeis hacerlo descargando los archivos a traves de la carpeta de Mega subida por Korea Descargass.

Un saludo y hasta pronto.

sábado, 9 de enero de 2016

Aprendiendo informatica: Programar un rombo. Practica universitaria.

Hace unos dias, un amigo y ex-compañero de trabajo me consultaba acerca de una practica que le habian encargado en su universidad y que por lo visto se le habia atascado. Como ya sabeis, me gusta transmitir los proyectos en que voy participando con fines divulgativos. Por eso, voy a explicar como se realiza lo que se describe en la practica. Podeis encontrar el enunciado aqui: https://app.box.com/s/4jl75k2gpsz5x04anr3xj4b1r433e4ch. Ire subiendo el codigo de cada parte que realice, para que veais como se hace, podeis leerlo y descargarlo en la carpeta correspondiente al proyecto: https://app.box.com/s/4ekl5r4puwdmjlkpby7jxe7gzwswb5zt

Este que veis sería el resultado de hacer un rombo de lado igual a 7.


      @
     @.@
    @.O.@
   @.O.O.@
  @.O.@.O.@
 @.O.@.@.O.@
@.O.@.O.@.O.@
 @.O.@.@.O.@
  @.O.@.O.@
   @.O.O.@
    @.O.@
     @.@
      @


Lo primero, analicemos como se hace un rombo, simplificandolo lo mas posible. Un rombo está formado por varias partes (sustituiré los puntos por espacios y el patrón por asteriscos). Tambien voy a numerar las lineas y columnas.


  1234567|654321 
1 ......*|       1
2 .....**|*      2
3 ....***|**     3
4 ...****|***    4
5 ..*****|****   5
6 .******|*****  6
7 *******|****** 7
----------------
6 .******|*****  6
5 ..*****|****   5
4 ...****|***    4
3 ....***|**     3
2 .....**|*      2
1 ......*|       1


Podemos observar que existen cuatro sectores. En el primer sector de nuestro ejemplo (recordemos que tiene un lado igual a 7), que es el situado arriba a la izquierda, vemos que existen siete columnas y siete filas. En el segundo sector, arriba a la derecha, vemos que existe el mismo numero de filas, pero una columna menos. En el tercer sector hay una fila menos y en el cuarto tanto una fila menos como una columna.

Os preguntareis por que he escrito varios numeros en forma creciente, y otros en forma decreciente. Esto tiene su razon de ser: en este caso necesitaremos que sea simetrico. El sistema sería mucho mas simple sin la simetría requerida, pero la práctica no cumpliría su finalidad.

Vamos a empezar a codificar nuestro programa. Usaré el valor de lado = 7 para las pruebas. Mas adelante incluiré la opcion de que pregunte que queremos hacer.

Necesitaremos un bucle que nos imprima los espacios. Como vamos a usar para nuestro ejemplo asteriscos, puntos y finalmente espacios, crearemos un pequeño procedimiento auxiliar que llamaré escribeCar.

void escribeCar(int veces, char car){
for (int i = 1; i <= veces; i++){
printf("%c",car);
}
}

Esto quiere decir que escriba el caracter car un numero veces de veces. Para ello, usaremos un contador llamado i.

Lo pondremos en práctica con la primera parte del rombo. En cada linea l podemos ver que hay e espacios y l asteriscos y que la suma de ambos es e+l = lado. Entonces en cada linea tendremos que poner (lado-l)-1 espacios  y asteriscos.

Vamos a codificar eso. Usamos el codigo que he puesto en el archivo ejemplo1.cpp

......*
.....**
....***
...****
..*****
.******
*******

Para verificar la simetria, en el siguiente punto, cambiaremos los asteriscos por el numero de caracter en la linea, y agregaremos el segundo sector. Para ese segundo sector, será necesario contar al revés, desde l-1 hasta 1. Codificamos y compilamos el ejemplo2.cpp y obtenemos lo siguiente:

......1
.....121
....12321
...1234321
..123454321
.12345654321
1234567654321

Tenemos ya medio rombo, ahora solo tenemos que hacer lo mismo de manera opuesta. Reorganizaremos parte del codigo para que quede mas "limpio", creando dos nuevos procedimientos correspondientes a la parte "creciente" y a la "decreciente" y despues le agregaremos la parte inferior usando los procedimientos mencionados previamente. Aqui teneis el ejemplo3.cpp:

......1
.....121
....12321
...1234321
..123454321
.12345654321
1234567654321
.12345654321
..123454321
...1234321
....12321
.....121
......1

Esto tambien se puede reorganizar mas todavia. En la siguiente versión lo haré. Lo proximo es asignar el caracter correspondiente para que el patrón sea el que nos piden. El patrón debe ser el siguiente:

Si el resto de dividir el numero del caracter mostrado por 4 es
0, poner @
2, poner o
1 o 3, poner .

Vemos ahora que hay un error que he cometido, que ha sido empezar a escribir las lineas empezando por 1. Tenemos ahora dos opciones, modificar el bucle original y resolverlo, o hacer un parchecito. Como me gusta hacer las cosas bien, corregiré el ejemplo3, y de paso le quitaré los puntos y los sustituiré por espacios. Podeis descargar la correccion en ejemplo4.cpp. Aqui teneis el resultado de la correccion.

      0
     010
    01210
   0123210
  012343210
 01234543210
0123456543210
 01234543210
  012343210
   0123210
    01210
     010
      0


Para cambiarlo, usaré una sentencia switch, que tambien la meteré en una funcion. Veamos el resultado del ejemplo5.cpp:


      @
     @.@
    @.o.@
   @.o.o.@
  @.o.@.o.@
 @.o.@.@.o.@
@.o.@.o.@.o.@
 @.o.@.@.o.@
  @.o.@.o.@
   @.o.o.@
    @.o.@
     @.@
      @

Y como podemos observar, el programa nos muestra los resultados deseados. Solo nos quedan dos detalles: introducir la posibilidad de elegir el tamaño del lado y comprobar que los resultados son correctos para 1, 2 y varios numeros pares e impares al azar.

Mi amigo tambien me planteaba una cuestion acerca de los arrays y me pregunto, ¿sería posible usar un array para la secuencia? La respuesta es muy simple: si. Cambiaremos el procedimiento selecCarac para que sea

char selecCarac(int carac){
char secuencia[]={'@','.','o','.'};
printf("%c",secuencia[carac%4]);
}

en lugar de ser

char selecCarac(int carac){
switch (carac%4){
case 0:
printf("%c", '@');
break;
case 2:
printf("%c", 'o');
break;
default:
printf("%c", '.');
break;
}
}

De hecho, la opcion que usa arrays es mucho mas eficiente, ya que en vez de realizar comparaciones simplemente accede a memoria. Por tanto, dejaremos esta opcion en el programa.

Tambien vamos a agregar parte de la interfaz, para que podamos pasar a la parte de pruebas. Aqui teneis el ejemplo6.cpp con la modificacion anterior y las lineas para poder introducir el numero de lados.

Ahora vamos a hacer unas comprobaciones, si no las hemos ido haciendo al probar. Que ocurre si:

-  Ponemos un valor impar de lados (probaremos con 9 lados):


        @
       @.@
      @.o.@
     @.o.o.@
    @.o.@.o.@
   @.o.@.@.o.@
  @.o.@.o.@.o.@
 @.o.@.o.o.@.o.@
@.o.@.o.@.o.@.o.@
 @.o.@.o.o.@.o.@
  @.o.@.o.@.o.@
   @.o.@.@.o.@
    @.o.@.o.@
     @.o.o.@
      @.o.@
       @.@
        @

El resultado es completamente valido.

- Ponemos un valor par de lados (probaremos con 8 lados):

       @
      @.@
     @.o.@
    @.o.o.@
   @.o.@.o.@
  @.o.@.@.o.@
 @.o.@.o.@.o.@
@.o.@.o.o.@.o.@
 @.o.@.o.@.o.@
  @.o.@.@.o.@
   @.o.@.o.@
    @.o.o.@
     @.o.@
      @.@
       @

El resultado es igualmente valido.

- Ponemos 1 unico lado:

@

Correcto de nuevo. Si hubieramos cometido un error, posiblemente habrian aparecido dos arrobas en vertical.

- Ponemos 2 lados:

 @
@.@
 @

Tambien es correcto. Si hubieramos cometido un error, podrian haber salido dos arrobas, como en el caso anterior.

- Ponemos 0 lados:

Obviamente, el programa no saca nada por pantalla.

- Ponemos un numero negativo (probaremos con -5):

Analogamente, un poligono no puede tener un valor de lado negativo, con lo que no muestra nada por pantalla. De hecho, vamos a hacer una comprobacion adicional: ¿escribe algo raro en donde van los espacios? Si cambio de nuevo el codigo para que en vez de los espacios vuelva a mostrar puntos no muestra absolutamente nada.

El código, por tanto, es correcto tanto en los casos indicados por el enunciado como en un juego de pruebas extendido. No voy a agregar el limite que indicaban en el enunciado, puesto que no me es necesario en para el proyecto.

Doy por concluido este proyecto. Espero que os haya resultado interesante. Desde el punto de vista didactico creo que lo es, ya que trata sobre descomposicion de problemas, bucles, secuencias de seleccion, arrays y juegos de pruebas.

Sobre la licencia del software: esta permitida la descarga, compilacion y modificación del codigo para su uso personal con fines didacticos (o sea, para experimentar). Todas las versiones derivadas de este software también deberán cumplir esta licencia. Queda prohibido su uso como implementación de la práctica (nada de copiar, que nos conocemos). Queda prohibida su uso didactico por terceros, ya sea para su uso en clases a titulo individual o publicacion en material docente. En cualquier caso, queda prohibido su uso con fines comerciales.

Hasta el proximo proyecto, un saludo.