Navegando por
Etiqueta: dev

¡rav1e GUI v1.14 disponible ya!

¡rav1e GUI v1.14 disponible ya!

Hola a todos,

En el día de hoy, he publicado la versión 1.14 de rav1e GUI:

rav1e GUI v1.14
rav1e GUI v1.14

Esta versión permite convertir archivos de video sin audio. También, el path de salida ahora será predefinido usando el path del archivo de entrada, cambiando la extensión a .webm. Por último, el path de salida también se actualizará dinámicamente si escribes el path de entrada manualmente.

Puedes descargar esta nueva versión en GitHub haciendo click aquí.

¡Disfruten!

Rav1e GUI v1.11 disponible ya

Rav1e GUI v1.11 disponible ya

Hola a todos,

En el día de hoy, he publicado la versión 1.11 de rav1e GUI:

Ventana principal de rav1e GUI v1.11
Ventana principal de rav1e GUI v1.11

Esta versión incluye soporte para los «tiles» en rav1e. Esto te permite convertir un video usando varios hilos sin la necesidad dividir el video en pedazos. La opción de los hilos es pasado a rav1e como argumento y con esto, el video será procesado maximizando los recursos de tu computadora.

La ventana de Opciones Avanzadas ha sido adaptada para incluir las opciones de filas y columnas de los «tiles»:

Opciones avanzadas de rav1e GUI v1.11
Opciones avanzadas de rav1e GUI v1.11

Esta versión también arregla un problema con la opción de Low Latency, y a la vez ajusta cómo esta opción es usada. También, la opción de velocidad ha sido cambiada de 3 a 5 ya que el 5 es la nueva velocidad por defecto en rav1e.

Finalmente, Opusenc ya no es necesario. El audio del video será convertido usando la librería libopus con ffmpeg. Esto elimina la necesidad de extraer el audio como archivo WAV y convertirlo luego. El audio es convertido directamente a Opus ahora.

Puedes descargar esta nueva versión en GitHub presionando aquí.

¡Disfruten!

Sábado de programación: rav1e GUI

Sábado de programación: rav1e GUI

Hola a todos,

En el día de hoy, estuve programando mi programa rav1e GUI. Ha pasado alrededor de un mes desde la última actualización, y rav1e ha obtenido algunas mejoras últimamente.

Aunque no he publicado una nueva versión del GUI, estuve programando algunas de las nuevas mejoras de rav1e. Desafortunadamente, las pruebas no funcionaron y creo que se debe a un problema en el convertido. No se preocupen, porque ya abrí un «issue» en GitHub para reportar esto:

problema de rav1e en github
El problema que reporté

Ahora, hablemos sobre las nuevas funciones en el GUI:

rav1e GUI v1.9 2018-02-23

Primero, cambié de posición el blanco donde escribimos el lugar temporero para almacenar los archivos mientras se converte nuestro video. Lo coloqué justo debajo del blanco del archivo de salida para que sea más accesible.

Segundo, pueden ver que cambié la opción del
cuantificador (quantizer) de lugar. También pueden ver que hay una opción para especificar el «Bitrate» y elegir entre utilizar el valor del cuantificador o el bitrate. Cuando seleccionamos una de estas 2 opciones, veremos que la opción respectiva se activa y la otra se desactiva.

Tercero, añadí la opción de convertir en 2 pasos (2-Pass), pero creo que esto no está implementado en rav1e todavía, sino que solamente tiene la opción de usarlo pero no hace nada.

Finalmente, renombré el botón de «Advanced Encoder Options» a «Advanced Options». Era redundante el primer nombre porque ya se encontraba en el grupo de «Encoder Options».

Ahora, hablemos sobre estas opciones avanzadas (Advanced Options):

rav1e GUI V1.9 2018-02-23 Advanced Options

Aquí, añadí 2 opciones, que son las siguientes:

  • Content Light
  • Range

También, debido a unos cambios en los valores por defecto de algunos parámetros en rav1e, hice unos cambios también en el GUI. Ahora, tenemos los siguientes valores por defecto:

  • Modo «Low Latency» está desactivado.
  • El valor de «Quality Tuning» ahora es «Psychovisual».

Y con esto, concluyo este post. Los cambios mencionados arriba los verán pronto, cuando pueda probar el GUI en su totalidad una vez rav1e me esté funcionando debidamente. Si te atreves, puedes descargar el código y compilarlo y probarlo. El código se encuentra en el repositorio del proyecto de GitHub. Puedes presionar aquí para ir directamente al repositorio.

¡Nos vemos pronto!

Días de programación y de aprendizaje – DLNA Player, mi nuevo invento

Días de programación y de aprendizaje – DLNA Player, mi nuevo invento

Hola a todos,

Hace un tiempo, recibí mi reproductor de música HiBy R3 y lo he estado usando a diario. Recientemente, comencé a usar su función de DLNA.

DLNA es un protocolo que se usa para comunicarse con reproductores audiovisuales, enviarle contenido y controlarlos. Consiste usualmente de lo siguiente:

  • Servidor: Aquí es donde almacenamos nuestro contenido (música, videos, imágenes, etc). Éstos son enviados al reproductor mediante un controlador que nos permite navegar en el servidor, escojer el contenido que queremos reproducir, y controlar nuestro reproductor.
  • Reproductor (Renderer): Éste es el dispositivo que se encarga de decodificar el contenido que obtiene del servidor. Algunos reproductores también funcionan como controlador.
  • Controlador: Ésto es como un control remoto. Escojes el archivo multimedia y el reproductor a usar y lo controlas.

Aunque estos son los componentes básicos, es posible que uno de los anteriores haga la función de otra parte. Por ejemplo, puede ser que el servidor funcione como controlador y reproductor, que el reproductor funcione como controlador, y que el controlador actue como reproductor.

Usando la función DLNA con un equipo Android es sencillo gracias a una aplicación llamada BubbleUPnP, a la cual compré su licencia de uso ya que la versión gratuita tiene limitaciones. Con esto, puedo escojer mi HiBy R3 como reproductor y navegar mis archivos en el celular, escogiendo la música que quiero escuchar y controlar el reproductor. El problema que tuve fue que en Windows no encontraba un programa que fuese compatible con el HiBy R3, pues funcionaban parcialmente o símplemente no funcionaban. Es por eso que comencé a leer acerca del protocolo DLNA/UPnP y comencé a ver algunos ejemplos. Luego, comencé a escribir mi propio programa que cumpla con los requisitos que quería.

Encontré un recurso en CodeProject el cual pueden ver aquí. Habla sobre cómo comunicarse con un reproductor, enviar el archivo a reproducir y controlarlo. Cuando lo probé, funcionó excelente con mi servidor web, pero para el programa que quería programar quería que funcione como un reproductor normal, así que necesitaba implementar un servidor interno, y es eso lo que me puse a investigar luego.

Comencé a buscar ejemplos de servidores HTTP para el lenguaje de programación C# y comencé a probarlos. Algunos funcionaban y cumplían su función, pero mi HiBy R3 no podía reproducir las canciones a pesar de que identificaba la canción. Resulta que necesitaba un servidor capáz de enviar pedazos de los archivos, y investigando un poco más, encontré este excelente recurso también en CodeProject, el cual implementa un simple servidor HTTP para enviar archivos multimedia a equipos DLNA.

Ambos códigos son de código abierto y su licencia permite el uso en proyectos al igual que permite su modificación, por lo que modifiqué esos códigos para que funcionen con mi proyecto de acuerdo a mis requerimientos.

Conoce «DLNA Player»:

DLNA Player
DLNA Player Screenshot

Diseñé mi reproductor de música usando los códigos anteriomente mencionados. Este reproductor te permite escojer un reproductor conectado a la red, construir una lista de archivos a reproducir, y controlar el mismo con sus botones de Play, Pausa, Stop, Track anterior y track siguiente. También permite navegar el archivo para poner la música en la parte que desees. Puedes ver el progreso de reproducción en tiempo real. Para ser mi primer programa que funcione así, no está nada mal 😁.

Algo importante es que el programa no reproduce los archivos, sino que símplemente lo copia a memoria para que el servidor interno responda a las llamadas del reproductor y le envíe la parte del archivo solicitada.

Para usar el programa, símplemente tienes que poner la dirección IP de tu computadora (El programa hace esto por tí, pero si tienes variaz interfaces de redes, el programa podría confundirse y usar una IP que no es la correcta), un puerto (lo que está luego del : en la dirección IP en la imagen de arriba), presionas el botón de aplicar (sólo si hubo algún cambio), y luego le das al botón de buscar reproductores. Selecciona uno y luego arrastra archivos al programa. Presiona el botón de Play y disfruta de la música.

El programa actúa como un servidor y es por eso que necesita la dirección IP de la computadora.

El código de este nuevo proyecto lo encuentran aquí. https://github.com/moisesmcardona/DLNA-Player

DLNA Player GitHub Repo

Esto lo probé con mi reproductor HiBy R3. Ahora puedo disfrutar de mi música descomprimida sin depender de conexiones Wifi, pues el programa envía el archivo original al reproductor y es el reproductor el que decodifica el archivo. Esto, y un buen amplificador y decodificador digital a análogo hacen que la música suene mucho mejor que nunca.

Espero que esta herramienta sea útil y esto ha sido una aventura de aprendizaje para mí. He estado prácticamente los pasados días en esto y lo importante es que no me rendí y pude hacer algo que disfrutaré todos los días, pues me encanta escuchar música a diario 😊.

Scripts y herramienta actualizada para mostrar mis tareas de BOINC en mi página web

Scripts y herramienta actualizada para mostrar mis tareas de BOINC en mi página web

Hola a todos,

En el fin de semana, me dediqué a mejorar la sección de las tareas BOINC en mi página web:

BOINC Statistics Website Update 1

Ahora, en vez de actualizar manualmente la página cuando tenga un equipo nuevo, he hecho que el archivo PHP se encargue de mantener la lista y las tareas al día. También, como este estilo no lo tenía en GitHub, lo reescribí y lo publiqué ahí. Previamente, el único archio que existía era el que se ve así:

BOINC Statistics Website Update 2

Debido a que ese muestra todas las tareas de todos los equipos en una sola tabla, escribí otro archivo en el que se muestren las tareas de los equipos en tablas separadas. Para esto, escribí algunas funciones y «loops» para que se obtenga toda la información almacenada relacionadas a las tareas. El resultado es el siguiente:

¿Se ve mejor, verdad?

Veamos el código:

Primero, separé la información de la base de datos y ahora la misma se encuentra en un archivo llamado config.php. También, estoy usando un objeto mysqli el cual es accesible en estos archivos. Debido a estos cambios, el archivo orignal tuvo que ser actualizado:

BOINC Statistics Website Update 5

Luego de realizar estos cambios, procedí a escribir el nuevo archivo llamado boinc_tasks_per_machine.php:

BOINC Statistics Website Update 6

Tenemos 3 funciones en este archivo:

BOINC Statistics Website Update 7

function printMachinesLinks($mysqli)

Esta función obtiene las máquina almacenadas en la base de datos MySQL y es usada para imprimir la lista, la cual al presionarla, te lleva a la tabla de esa máquina.

function getTasksFromMachines($mysqli)

Luego de obtener la lista de las máquinas, llamamos a esta función la cual simplemente llama la próxima funcion para cada máquina.

function getTasksPerMachine($mysqli, $machine)

Esta función es la encargada de generar las tablas de cada máquina y también imprime el encabezado.

Ahora, podemos imprimir nuestra lista y tabla de máquinas usando estas 2 simples líneas:

printMachinesLinks($mysqli); 
getTasksFromMachines($mysqli);

La primera línea llama la función printMachinesLinls($mysqli) para imprimir la lista de máquinas y la segunda línea es la que obtiene las tareas y genera la tabla.

El programa que obtiene las tareas y las almacena en la base de datos

BOINC Statistics Website Update 8

También hice algunos cambios al programa de escritorio que obtiene las tareas y las almacena en la base de datos. Primero, convertí la rutina TruncateTablesen una función, returnandoTrue si tuvo éxito limpiando la tabla y False si no:

BOINC Statistics Website Update 9

También añadí un elemento NotifyIcon el cual muestra un ícono en el «system tray» de la computadora cuando se minimiza la pantalla. Así puedes minimizar el programa y se mantendrá ejecutando y populando la base de datos con las tareas. Tambien, añadi el argumento -s el cual gracias a él, podemos añadir una tarea en el «Task Shedule» de la computadora para iniciar el programa cada vez que encendemos el equipo y comienze a actualizar la base de datos:

BOINC Statistics Website Update 10

Luego, hice que el botón de obtener las tareas también funcione para parar el proceso:

BOINC Statistics Website Update 11

Y por último, limpié el código un poco:

BOINC Statistics Website Update 12

¡Y eso es todo! Mejoré el programa y el script en varias formas. Ahora la página se actualiza dinámicamente debido a estos cambios. ¡No tengo que añadir las máquina manualmente! Sólo las añado en el programa y el archivo PHP se encarga del resto.

Debido a que los archivos PHP son muy simples, podemos integrarlos en la página sencillamente copiando y pegando el contenido del mismo. En este caso, he integrado el archivo PHP en mi página web que usa Drupal.

Archivos PHP:

Los archivos PHP se encuentran aquí.

Ejemplo de integración:

Puedes ver el archivo integrado en mi página web aquí.

Repositorio:

El código de la herramienta y los archivos PHP se encuentran en GitHub aquí.

¿Qué debería hacer próximamente? Dejame saber en los comentarios

Posts anteriores:

  1. Post introductorio
  2. Versión 1.1
  3. Versión 1.2
Liberando el código de mi app: Collatz Conjecture Calculator

Liberando el código de mi app: Collatz Conjecture Calculator

Collatz Conjecture Android App - 1

Hola a todos,

En este post, les informo que he liberado el código de mi app de Android llamada Collatz Conjecture Calculator:

Collatz Conjecture Android App - 2

Esta app es una calculadora de la Conjectura Collatz, el cual también es conocido como la regla 3x+1.

La aplicación es muy sencilla. El código actual que realiza las operaciones matemáticas es el siguiente:

Collatz Conjecture Android App - 3

La app almacena cada paso y lo muestra al usuario, hasta llegar al final.

v1.3

Además de liberar el código, también hice público la versión 1.3, el cual cambia el símbolo «/» por el de división ÷, y «x» por el símbolo de multiplicación ×.

Captura de pantalla:

La aplicación sólo tiene una pantalla, el cual es la de realizar la operación matemática:

Collatz Conjecture Android App - 4

Testimonios de los usuarios:

Algunos de los comentarios que los usuarios de esta app han hecho:

Collatz Conjecture Android App - 5

Actualicé esta app usando Android Studio 3.0:

Collatz Conjecture Android App - 6

Pueden ver el código en GitHub aquí.

Y pueden descargar la app a sus celulares aquí.

¡Disfruten!

Actualizaciones al Generador de Reportes de Nuevos Usuarios del Equipo Gridcoin – 15 de febrero de 2018

Actualizaciones al Generador de Reportes de Nuevos Usuarios del Equipo Gridcoin – 15 de febrero de 2018

Hola a todos,

En el día de ayer y de hoy, estuve actualizando mi generador de reportes de nuevos usuarios del equipo Gridcoin, el cual ahora permite ser programado para generar los reportes sin interacción del usuario.

Básicamente, lo que esto significa es que podemos usar la interfaz gráfica para seleccionar los proyectos que queremos sean incluidos en el reporte y luego lanzar el programa a través de la línea de comando con el parametro -s para que el reporte sea generado.

La actualización del código que hice en el día de ayer simplemente añade un nuevo parámetro llamado Silent (silencioso):

Update to the Gridcoin New User Report Generator - February 14, 2018 - 1

El cual será True (cierto) cuando le pasemos -s como parámetro en el terminal:

Update to the Gridcoin New User Report Generator - February 14, 2018 - 2

Esto hará que se llame la rutina principal del programa y se genere el reporte.

En la función PublishReport, si tiene el parámtro Silent falso, no nos mostrará ningún mensaje cuando el reporte sea publicado a menos que ocurra un error. Es por eso que el parámetro es llamado Silent, ya que todo ocurre sin la interacción del usuario:

Update to the Gridcoin New User Report Generator - February 14, 2018 - 3

La idea es que este programa se pueda programar para generar los reportes a traves de la herramienta Task Scheduler de Windows, para que así los reportes sean generados todos los días.

Entonces, en el día de hoy, me dí cuenta que que en la función GenerateReport, debía comparar la variable booleana Silent y verificar que sea False (falso) en vez de True (cierto). No me había percatado de esto hasta que vi el mensaje diciendo que el reporte fue generado y publicado el cual se supone que no se mostrara:

Update to the Gridcoin New User Report Generator - February 14, 2018 - 4

¡Eso es todo!

Código en GitHub.

Una pequeña modificación al Generador de Reportes de Nuevos Usuarios de Gridcoin

Una pequeña modificación al Generador de Reportes de Nuevos Usuarios de Gridcoin

Hola a todos,

En la noche de ayer, estaba mirando el código de mi programa de generar los reportes de Gridcoin y noté que había escrito una variable mal.

Había escrito MySQLFile en el módulo GenerateReport.vb. Ese objeto debía haberse llamado AccountFile ya que esa sección del código es la encargada de leer el archivo de la cuenta a donde postearemos el reporte. Así que renombré esa variable de ese objeto.

Esta es la modificación que le hice al código:

Gridcoin bug fix

Esto no afecta el programa y es simplemente un cambio para que el código se pueda entender mejor.

También removí un Imports que no estaba en uso.

¡Eso es todo!