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í ...

… a ordenar archivos en carpetas según el patrón de nombre

Descargando un montón de referencias desde Instagram usando esta maravillosa extensión, Instagram Download Button, me llené de archivos JPG y MP4 y se hacía necesario ordenarlos en carpetas.

El patrón es que todos los archivos tienen en la primer parte del nombre la perfil de Instagram y luego la fecha y hora original del posteo seguidos de un choclazo de números, así que tendría que ser «relativamente» sencillo poder encarpetarlos identificando el perfil.

nombre_perfil-YYYYMMDD_HHMMSS-XXXXXXXXX….. [jpg|mp4]

Buscando en encontré varias propuestas aproximadas para hacer algo como lo que quería

Y la opción ganadora

Extract part of a file name in bash

Específicamente esta respuesta que utiliza el comando SED. La única condición es que la primera parte no sean numeros.

El escenario

I have a folder with lots of files having a pattern, which is some string followed by a date and time:

BOS_CRM_SUS_20130101_10-00-10.csv (3 strings before date)
SEL_DMD_20141224_10-00-11.csv (2 strings before date)
SEL_DMD_SOUS_20141224_10-00-10.csv (3 strings before date)

I want to loop through the folder and extract only the part before the date and output into a file.

Output
BOS_CRM_SUS_
SEL_DMD_
SEL_DMD_SOUS_

La propuesta

Assuming you wont have numbers in the first part, you could use:

$ for i in *csv;do  str=$(echo $i|sed -r 's/[0-9]+.*//'); echo $str; done
BOS_CRM_SUS_
SEL_DMD_
SEL_DMD_SOUS_

Prueba

Cuando hice la prueba, solo mostrando el resultado del SED, funcionaba casi como lo deseaba, con el único tema que era que procesaba algunos archivos con otros patrón de nombre (que no eran necesarios) y los que si debía procesar dejaba el guión del medio.

Ejemplo:

almendromaestro-20220602_195749-285312905_1062446314350240_327302066906487345_n.jpeg

> almendromaestro-

Mi modificación a la RegExp

Agregar un guión que aparece antes de la regla para la fecha, así sólo busca los archivos que se aproximan al patrón.

sed -r 's/-[0-9]+.*//'

y pasó el testeo!

Script terminado

Básicamente hace un loop en todos los archivos que haya en la carpeta, separa el nombre y la almacena en STR (y lo mostramos para ir viendo el progreso), usa eso para verificar que si no existe una carpeta la crea, y luego mueve el archivo a la carpeta.

#!/bin/sh

for i in *.*
do
  str=$(echo $i|sed -r 's/-[0-9]+.*//'); 
  echo $str;
  if [ ! -d $str ]; then
      mkdir $str
  fi
  mv $i $str
done

Y chau!

Categorías
hoy aprendí ...

… a redimensionar varias imágenes con un script bash

Y tenía que procesar varias imágenes escaneadas para bajarles el tamaño de las dimensiones y archivo.

Con ImageMagick en Linux esto se logra con un script bash que recorra los archivos en una carpeta. Me topé con esta solución que me pareció bastante sencilla, hay que hacer algunas cosas previas de manera ‘manual’ pero funciona.

El script trabaja y busca las imágenes sobre una carpeta que se indica dentro del script, con lo que hay que personalizarlo. Tener la precaución de que las imágenes sean copias, porque las reemplaza.

#!/usr/bin/env bash
# Purpose: batch image resizer
# Source: https://guides.wp-bullet.com
# Author: Mike

# absolute path to image folder
FOLDER="/var/www/wp-bullet.com/wp-content/uploads"

# max width
WIDTH=540

# max height
HEIGHT=300

#resize png or jpg to either height or width, keeps proportions using imagemagick
#find ${FOLDER} -iname '*.jpg' -o -iname '*.png' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

#resize png to either height or width, keeps proportions using imagemagick
#find ${FOLDER} -iname '*.png' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

#resize jpg only to either height or width, keeps proportions using imagemagick
find ${FOLDER} -iname '*.jpg' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

# alternative
#mogrify -path ${FOLDER} -resize ${WIDTH}x${HEIGHT}% *.png -verbose

Gracias:

https://guides.wp-bullet.com/batch-resize-images-using-linux-command-line-and-imagemagick/

Y chau.

Categorías
hoy aprendí ...

… a sincronizar datos entre GNUCash version android y desktop (linux y windows)

Llevando la contabilidad hogareña por años con excel, luego de decidirme a dar un paso más allá llegué en algún momento a GNU Cash

Probá la versión de escritorio en linux y luego de leer algunos tutoriales (tengo que buscas los links) empezé a llevar el registro en la computadora de escritorio.

Pero el registro del día a día lo anotaba en el celu en notas sueltas, hasta que encontré la versión móvil para android, y la verdad es que para las entradas (o transacciones) sencillos resulta fácil.

La clave está en usar archivos QIF. Y el flujo debe ser del móvil al escritorio. Luego vaciar el móvil.

Una funcionalidad interesante desde el escritorio al momento de importar es que si por alguna razón creo cuentas nuevas en el móvil o duplico una transacción hay posibilidad de revisar los cotejos y decidir si emparejar o crear nuevas cuentas.

El importador de QIF de la versión 3.5 de MS Windows tiene varios pasos muy bien explicados.

Un detalle importante es que los archivos QIF no son multimonedas, así que hay que estar atentos a la moneda utilizada. Todavía no tuve la oportunidad de probar esto último.

Categorías
hoy aprendí ...

…a «mejorar» una imagen sin photoshop

Necesito ampliar una imagen sin que se degrade tanto.

Había usado hace un tiempo el servicio de Let’s Enhance, pero sólo deja 5 pruebas gratis, luego hay que pagar.

Buscando algo alternativo caigo en esta entrada de Shivani Srivastava con varias opciones.

Necesitaba que fuera un servicio en línea para no tener que instalar ningún software, me quedé con este que tiene además tiene repo en GitHub

waifu2x.udp.jp

Gracias.