Aplicacion de escritorio para Windows construida con Electron, React y TypeScript para:
- dividir videos por duracion, tamaño aproximado o numero de partes;
- comprimir videos a un tamaño objetivo o con un preset de calidad;
- previsualizar una estimacion antes de ejecutar FFmpeg;
- procesar archivos localmente con binarios empaquetados de FFmpeg y FFprobe.
La app tiene un flujo simple:
- Seleccionar un video de entrada.
- Seleccionar una carpeta de salida.
- Analizar el archivo con FFprobe para extraer metadatos.
- Elegir una operacion:
Split: divide el video.Compress: comprime el video.
- Revisar la estimacion calculada.
- Ejecutar el proceso y seguir el progreso en tiempo real.
By duration: divide por duracion maxima por segmento.By size (approx.): estima la duracion de cada parte a partir del bitrate del archivo.Number of parts: reparte el video en un numero fijo de partes.
Target size: intenta generar un MP4 con un peso aproximado. Generalmente ocupa menos de lo solicitado ( p.ej videos de ~3GB, se solicita 400Mb, resultado ~280Mb)Quality preset: comprime usando presets de calidad (high,medium,low).
La compresion genera salida MP4 con video H.264 y audio AAC.
- Electron para el proceso principal y la ventana de escritorio.
- React 19 para la interfaz.
- Vite para desarrollo y build del renderer.
- TypeScript para main, preload y renderer.
ffmpeg-staticyffprobe-staticpara empaquetar los binarios.- Vitest para tests unitarios.
src/
main/
main.ts # proceso principal de Electron
preload.ts # API expuesta al renderer
services/ # FFmpeg, FFprobe y ejecucion de jobs
renderer/
App.tsx # interfaz principal
main.tsx # bootstrap de React
styles.css # estilos
shared/
estimation.ts # reglas de estimacion
format.ts # formateadores
types.ts # tipos compartidos
tests/
estimation.test.ts # tests de la logica de estimacion
- Node.js 20 o superior recomendado.
- npm 10 o superior recomendado.
- Windows para generar y ejecutar el paquete
.exe.
npm installnpm run devEsto levanta:
- Vite en
http://localhost:5173 - compilacion en watch del proceso principal de Electron
- Electron apuntando al servidor de desarrollo
npm testnpm run buildEste comando genera:
dist-renderer/para la interfaz compilada;dist-electron/para el proceso principal y preload.
npm run distSalida esperada:
release/VideoUtils 1.0.0.exerelease/win-unpacked/
win-unpacked contiene la aplicacion descomprimida, util para pruebas manuales. El .exe portable es el artefacto para distribuir.
La app cargada desde archivo local necesita rutas relativas a los assets del renderer. Por eso vite.config.ts usa:
base: "./"Sin eso, la build puede abrir una ventana en blanco porque index.html intentaria cargar /assets/... en vez de ./assets/....
- Pulsa
Choose video. - Pulsa
Choose folder. - Pulsa
Analyze video. - En
Configuration, seleccionaSplit. - Elige el modo y los parametros.
- Revisa
Estimate. - Pulsa
Process video.
- Selecciona archivo y carpeta.
- Analiza el archivo.
- En
Configuration, seleccionaCompress. - Elige
Target sizeoQuality preset. - Ajusta el bitrate de audio si hace falta.
- Revisa
Estimate. - Ejecuta
Process video.
- Crea una rama desde
main. - Haz cambios pequenos y coherentes.
- Ejecuta
npm test. - Si tocas UI o empaquetado, ejecuta tambien
npm run build. - Abre un Pull Request con descripcion clara, impacto y pasos de prueba.
- Mantener
src/sharedcomo fuente comun de tipos y reglas. - No llamar a Node directamente desde React; usar
preload.tse IPC. - Si cambias empaquetado o rutas, probar tanto
npm run devcomonpm run dist. - Si introduces una nueva regla de estimacion, anade tests en
tests/estimation.test.ts.
- El cambio funciona en
npm run dev. -
npm testpasa. -
npm run buildpasa. - Si afecta al empaquetado,
npm run distgenera el.execorrectamente. - La documentacion se ha actualizado si el comportamiento cambia.
Revisar:
- que
vite.config.tsmantengabase: "./"; - que exista
dist-renderer/index.htmldentro del paquete; - que
main.tscarguedist-renderer/index.htmlcuando no hayVITE_DEV_SERVER_URL.
Revisar:
- que
ffmpeg-staticyffprobe-staticesten endependencies, no endevDependencies; - que el empaquetado incluya
node_modules; - que el antivirus no este bloqueando la ejecucion de binarios empaquetados.
Es esperable en parte:
- la division por tamano es aproximada;
- la compresion a tamano objetivo depende del contenido real del video;
- audio, GOP, escenas y complejidad visual afectan al tamano final.
{
"dev": "Desarrollo completo con renderer + main + Electron",
"build": "Build del renderer y del proceso principal",
"dist": "Build completo y empaquetado portable para Windows",
"test": "Tests unitarios con cobertura"
}- configurar icono de aplicacion para evitar el icono por defecto de Electron;
- considerar
asar: trueconasarUnpackpara binarios externos; - anadir tests de integracion para el flujo IPC;