Categorías
hoy aprendí ...

… a convertir una bocha de videos mp4 cambiando la resolución con ffmpeg

Y entonces, luego de copiar todos los videos que había grabado con el teléfono celular en mis procesos de dibujo, me encontré con que el espacio que ocupaban era demasiado grande. No necesitaba tanta resolución, así que la idea de convertirlos en un proceso automatizado empezó a emerger.

Intenté realizar la conversión con VLC, ya que permite hacerlo con un listado de archivos y configurar muchas opciones. El principal problema es que el archivo de salida tenía errores en los primeros segundos del video: no aparecía nada o se veía un fotograma estático hasta pasados 5 o 6 segundos. Investigando un poco en los foros encontré que al parecer había un problema con los keyframes iniciales. Algunas soluciones propuestas era convertirlos al codec H.265, pero yo prefería mantenerlos en H.264.

Recordé que existe FFMPEG, una potente herramienta para estas tareas de video, así que recurrí a una IA para que me ayude a generar un archivo BATCH para Windows (que es en donde estoy realizando el proceso).

Primero hay que instalar FFMPEG y configurar las variables de entorno de Windows así se puede ejecutar en la línea de comandos desde cualquier lado.

  1. Descargar FFMPEG
  2. Descomprimir y ubicar en la carpeta C:\ffmpeg\
  3. Abrir el menú inicio de Windows
  4. Buscar ‘Enviroment Variables’
  5. El tutorial pone hacerlo en las variables del sistema, pero se puede hacer en el de usuario también. Editar ‘path’
  6. Agregar la ruta ‘C:\ffmpeg\bin\
  7. Darle OK a las ventanas para validar y salir.
  8. En la línea de comando ejecutar: ffmpeg -version
  9. Y debería mostrar información del programa.

Si lo anterior está OK entonces copiar el código y guardarlo como un archivo .BAT en cualquier lugar, lo mejor es tenerlo en la carpeta home del usuario que estemos usando (C:\users\myuser\)

@echo off
setlocal enabledelayedexpansion

:: Ruta de la carpeta con los videos
set "carpeta_videos=C:\ruta\a\tu\carpeta\videos"

:: Ruta de salida para los videos procesados
set "carpeta_salida=C:\ruta\a\tu\carpeta\salida"

:: Crear carpeta de salida si no existe
if not exist "%carpeta_salida%" mkdir "%carpeta_salida%"

:: Recorrer todos los archivos MP4 en la carpeta
for %%f in ("%carpeta_videos%\*.mp4") do (
    :: Obtener el nombre del archivo sin la ruta
    set "nombre_archivo=%%~nxf"

    :: Reducir la resolución al 50% usando FFmpeg
    ffmpeg -i "%%f" -vf "scale=iw/2:ih/2" "%carpeta_salida%\%%~nf.mp4"

    echo Procesado: %%f
)

echo ¡Procesamiento completado!
pause

Antes de ejecutar configura el código correctamente.

Explicación del Script:

  1. Variables:
    • carpeta_videos: Ruta de la carpeta donde están los videos originales.
    • carpeta_salida: Ruta de la carpeta donde se guardarán los videos procesados.
  2. Bucle for:
    • Recorre todos los archivos MP4 en la carpeta especificada.
  3. FFmpeg:
    • El comando ffmpeg -i "%%f" -vf "scale=iw/2:ih/2" reduce la resolución al 50%:
      • iw/2: Divide el ancho original (iw) por 2.
      • ih/2: Divide la altura original (ih) por 2.
  4. Salida:
    • Los videos procesados se guardan en la carpeta de salida con el mismo nombre que el archivo original.

Instrucciones:

  1. Guarda el archivo .bat en una ubicación conveniente.
  2. Edita las rutas de carpeta_videos y carpeta_salida para que coincidan con tus carpetas.
  3. Haz doble clic en el archivo .bat para ejecutarlo.

Notas:

  • Si quieres cambiar el formato de salida (por ejemplo, a .mkv), solo modifica la extensión en la línea de FFmpeg: "%carpeta_salida%\%%~nf.mkv".
  • Si deseas mantener la relación de aspecto exacta, puedes usar scale=iw/2:-2 en lugar de scale=iw/2:ih/2.

En mi primera experiencia, tenía una carpeta con 104 videos mp4 ocupando 10Gb aproximadamente.

El script los reduce a la mitad de resolución y terminaron ocupando ¡700Mb!

Demoró aproximamente 1hora (en mi equipo de Intel Core i7 con 16Gb RAM), leyendo los videos desde un disco externo con USB 3.0 y escribiendo en un SSD interno. Es lo que hay).

Y chau!


Bonus Track

Al procesar los archivos, los nuevos tienen la fecha actual. Si queremos que conserven a fecha del archivo original se puede usar el script con una modificación para copiar los atributos de fechas (creación, último acceso, última modificación).

En un primer intento los archivo de destino estaban dentro de la carpeta de usuario de Windows, pero por algún motivo el script lanzaba un error de que no tenía permisos para trabajar en la carpeta destino. Probé soluciones alternativas usando BASH en la consola de GIT con el comanto ‘touch’ pero no funcionaron. Lo que si funcionó fue mover la carpeta de destino a otra ubicación fuera de la carpeta de usuario de Windows.

Script CONVERSION + FECHA

@echo off
setlocal enabledelayedexpansion

:: Ruta de la carpeta con los videos originales
set "carpeta_videos=C:\ruta\a\tu\carpeta\videos"

:: Ruta de salida para los videos procesados
set "carpeta_salida=C:\ruta\a\tu\carpeta\salida"

:: Crear carpeta de salida si no existe
if not exist "%carpeta_salida%" mkdir "%carpeta_salida%"

:: Recorrer todos los archivos MP4
for %%f in ("%carpeta_videos%\*.mp4") do (
    :: Nombre del archivo de salida
    set "archivo_salida=%carpeta_salida%\%%~nf.mp4"

    :: Convertir el video con FFmpeg (resolución al 50%)
    ffmpeg -i "%%f" -vf "scale=iw/2:ih/2" "!archivo_salida!"

    :: Copiar atributos de fecha/hora del archivo original al nuevo
    powershell -command "$original = Get-Item '%%f'; $nuevo = Get-Item '!archivo_salida!'; $nuevo.CreationTime = $original.CreationTime; $nuevo.LastWriteTime = $original.LastWriteTime; $nuevo.LastAccessTime = $original.LastAccessTime;"

    echo Procesado: %%f (atributos de fecha/hora copiados)
)

echo ¡Proceso completado con éxito!
pause

¿Qué hace este script?

  1. Convierte los videos con FFmpeg (igual que antes).
  2. Usa PowerShell para copiar:
    • Fecha de creación (CreationTime),
    • Fecha de última modificación (LastWriteTime),
    • Fecha de último acceso (LastAccessTime),
      del archivo original al archivo convertido.

Instrucciones:

  1. Asegúrate de que FFmpeg esté instalado y en el PATH.
  2. Actualiza las rutas de carpeta_videos y carpeta_salida.
  3. Ejecuta el script desde la línea de comandos o haciendo doble clic.

Notas importantes:

  • PowerShell es necesario para este script (viene preinstalado en Windows 10).
  • Si el archivo de salida ya existe, será sobrescrito.
  • Los tiempos se copian con precisión de milisegundos.

Script para solo copiar fechas

@echo off
setlocal enabledelayedexpansion

:: Rutas de las carpetas
set "carpeta_original=C:\ruta\a\originales"
set "carpeta_convertidos=C:\ruta\a\convertidos"

:: Recorrer archivos originales
for %%f in ("%carpeta_original%\*.mp4") do (
    :: Obtener nombre del archivo
    set "nombre_archivo=%%~nf.mp4"

    :: Verificar si existe el archivo convertido
    if exist "%carpeta_convertidos%\!nombre_archivo!" (
        :: Copiar atributos de fecha/hora usando PowerShell
        powershell -command "$original = Get-Item '%%f'; $convertido = Get-Item '%carpeta_convertidos%\!nombre_archivo!'; $convertido.CreationTime = $original.CreationTime; $convertido.LastWriteTime = $original.LastWriteTime; $convertido.LastAccessTime = $original.LastAccessTime;"
        echo Fechas copiadas: !nombre_archivo!
    ) else (
        echo Archivo no encontrado en convertidos: !nombre_archivo!
    )
)

echo ¡Proceso de copia de fechas completado!
pause

¿Cómo funciona?

  1. Variables:
    • carpeta_original: Carpeta con los archivos originales (con las fechas correctas).
    • carpeta_convertidos: Carpeta con los archivos ya convertidos (a los que quieres copiar las fechas).
  2. Bucle for:
    • Recorre todos los archivos .mp4 en la carpeta original.
    • Para cada archivo, verifica si existe un archivo con el mismo nombre en la carpeta de convertidos.
  3. PowerShell:
    • Copia tres atributos de fecha/hora:
      • CreationTime (fecha de creación),
      • LastWriteTime (fecha de última modificación),
      • LastAccessTime (fecha de último acceso).

Instrucciones:

  1. Actualiza las rutas de carpeta_original y carpeta_convertidos en el script.
  2. Ejecuta el archivo .bat como administrador (para evitar errores de permisos).
  3. ¡Listo! Los archivos convertidos tendrán las mismas fechas que los originales.

Notas:

  • Requisito: Los archivos convertidos deben tener exactamente el mismo nombre que los originales.
  • Si hay archivos en convertidos que no existen en originales, se ignorarán.
  • PowerShell es necesario (viene preinstalado en Windows 10).

Ahora si, chau!

Categorías
hoy aprendí ...

… por quincuagésima vez a establecer el password para el usuario root en mysql :(

Como lo estoy haciendo en una máquina virtual que solamente tengo acceso yo lo hago de la manera menos recomendada desde el punto de vista de seguridad, así que amiguitos no hagan esto en sus servidores de producción:

— inicio del texto copiado y pegado tal cual —

How to set MySQL password for the first time

Do note, I will refer to MySQL with the idea that everything will work for both MySQL and MariaDB.

Typically, during the installation of MySQL and MariaDB, you are asked to set an initial password. If, for whatever reason that didn’t happen, you will need to set a password for the first time. To do that, open up a terminal window and issue the following command:

mysqladmin -u root password NEWPASSWORD

Where NEWPASSWORD is the password to be used. Now, when you log into MySQL, with the command mysql -u root -p, you will be prompted to enter the newly configured password.

— fin del texto copiado y pegado tal cual —

Hay otros métodos nombrados en el artículo más recomendados para evitar comprometer la seguridad del sistema donde se tenga que realizar este procedimiento.

Gracias https://www.techrepublic.com/article/how-to-set-change-and-recover-a-mysql-root-password/

Y chau!

Categorías
hoy aprendí ...

…a agregar más de un autor a una obra en Calibre

Retomé el trabajo de catalogar la biblioteca de casa y cuando empecé a agregar las historietas me encontré con la dificultad de agregar más de un autor por obra en Calibre.

Gracias a los foros de la vieja internet (porque en el manual oficial no lo encontré) aprendí que se usa el ampersand (&) como encadenador (¡obviamente!).

Y chau.


Nota: dado que Calibre utiliza un sistema de carpetas basado en AUTOR / OBRAS, la carpeta va a ser creada solamente con el nombre del primer autor de la lista.

Categorías
hoy aprendí ...

… a recordar como montar un cdrom en linux

https://linuxconfig.org/how-to-mount-cdrom-in-linux

How to mount cdrom in Linux

15 October 2021 by Luke Reynolds

These days, CDs and DVDs are becoming less popular, in favor of flash drives and other convenient, portable media. However, you still may come across them every once in a while, and if your computer has a CD drive, you should be able to insert a disc and mount it on Linux.

In this tutorial, you’ll see the Linux commands necessary to mount a CDROM.

In this tutorial you will learn:

  • How to mount cdrom in Linux
CategoryRequirements, Conventions or Software Version Used
SystemAny Linux distro
SoftwareN/A
OtherPrivileged access to your Linux system as root or via the sudo command.
Conventions# – requires given linux commands to be executed with root privileges either directly as a root user or by use of sudo command
$ – requires given linux commands to be executed as a regular non-privileged user

Follow along with the steps below to mount a CD or DVD in Linux. Start off by inserting the disc into your computer, then run through these steps:

  1. First, try using the blkid command to see what device file your CD is using. Usually, this is going to be /dev/sr0, but it’s possible that yours is something different. You’ll know it’s the right one because it should say ISO9660Viewing device file path of cdrom in Linux
  2. Next, create a mount point for where you’d like to mount the CD to. Or, just pick an empty directory somewhere on your computer, if you already have a place in mind.$ sudo mkdir /mnt/cdrom
  3. Now we can use the mount command to map the device file to the directory we’ve just created.$ sudo mount /dev/sr0 /mnt/cdrom mount: /mnt/cdrom: WARNING: device write-protected, mounted read-only.
  4. Your CD or DVD should now be accessible in the directory which it was mounted to.$ cd /mnt/cdrom You can also verify that the mount was successful by using the mount command without further options.$ mount | grep cdrom Accessing a mounted cdrom in Linux
  5. When you are done, just unmount the CD and eject it from the disc tray.
    $ sudo umount /mnt/cdrom

Closing Thoughts

In this tutorial, we saw how to mount a CD or DVD rom on Linux systems. As you can see, the process is quite simple, and you will probably be able to do it in the future without a problem, now that you have done it once. Mounting and accessing a CDROM is pretty similar to mounting any other type of media.

Categorías
hoy aprendí ...

… a realizar chapucerías con caracteres y fórmulas en hojas de cálculo

Resulta que una tabla con nombres debía prepararla para ser procesada por PHP para generar contenido repetitivo. El nombre de la persona escrito de manera normal debia luego usarlo como nombre de archivo en el servidor web para cargar la foto, dejando todo en minúscula y reemplazando espacios con guión bajo, y acentos.

Ej:

Juan Pérez -> juan_perez

Resulta que en LibreOffice Calc (y asumo que en Excel también) hay una funciones para trabajar con strings (cadenas de caracteres).

=MINUSC(SUSTITUIR(B10;" ";"_"))

Básicamente logra pasar a minúscula y reemplazar los espacios.

Juan Pérez -> juan_pérez

La última parte de reemplazar los caracteres especiales de acentos, ñ, y apóstrofes lo terminé realizando en PHP con la ayuda de https://codigosdeprogramacion.com/2019/07/11/quitar-acentos-y-tildes-en-php/

function eliminar_acentos($cadena){

    //Reemplazamos la A y a
    $cadena = str_replace(
    array('Á', 'À', 'Â', 'Ä', 'á', 'à', 'ä', 'â', 'ª'),
    array('A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a'),
    $cadena
    );

    //Reemplazamos la E y e
    $cadena = str_replace(
    array('É', 'È', 'Ê', 'Ë', 'é', 'è', 'ë', 'ê'),
    array('E', 'E', 'E', 'E', 'e', 'e', 'e', 'e'),
    $cadena );

    //Reemplazamos la I y i
    $cadena = str_replace(
    array('Í', 'Ì', 'Ï', 'Î', 'í', 'ì', 'ï', 'î'),
    array('I', 'I', 'I', 'I', 'i', 'i', 'i', 'i'),
    $cadena );

    //Reemplazamos la O y o
    $cadena = str_replace(
    array('Ó', 'Ò', 'Ö', 'Ô', 'ó', 'ò', 'ö', 'ô'),
    array('O', 'O', 'O', 'O', 'o', 'o', 'o', 'o'),
    $cadena );

    //Reemplazamos la U y u
    $cadena = str_replace(
    array('Ú', 'Ù', 'Û', 'Ü', 'ú', 'ù', 'ü', 'û'),
    array('U', 'U', 'U', 'U', 'u', 'u', 'u', 'u'),
    $cadena );

    //Reemplazamos la N, n, C y c
    $cadena = str_replace(
    array('Ñ', 'ñ', 'Ç', 'ç'),
    array('N', 'n', 'C', 'c'),
    $cadena
    );

    //Reemplazamos apróstrofes ' ’ ` ´
    $cadena = str_replace(
    array("'", '’', '`', '´'),
    array('', '', '', ''),
    $cadena
    );

    return $cadena;
}

Y chau