Convierte videos horizontales (16:9) a verticales (9:16) con inteligencia artificial que sigue al sujeto en tiempo real.
Empezar · Arquitectura · AI Service · API Docs · Equipo
Shortify automatiza lo que un editor haría manualmente: convertir un video horizontal a formato vertical para redes sociales, centrando inteligentemente al sujeto principal.
|
|
| Característica | Descripción |
|---|---|
| 🎯 Detección de rostros | OpenCV + Haar Cascade detecta al sujeto principal |
| 🎬 Tracking dinámico | El recorte sigue al sujeto a lo largo del video con transiciones suaves |
| ⏱ Corte por segmentos | Soporta recorte temporal (inicio/fin) antes de la conversión |
| 🔄 Procesamiento async | Los videos se procesan en segundo plano sin bloquear la API |
| 🐳 Docker ready | Un solo comando levanta toda la infraestructura |
| 📡 API REST + Swagger | Documentación interactiva integrada |
| 🧹 Limpieza automática | Los videos se eliminan automáticamente después de 30 minutos |
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ Frontend │────▶│ Backend │────▶│ AI Service │
│ Next.js 16 │ │ Spring Boot 4 │ │ FastAPI+OpenCV │
│ Port 3000 │ │ Port 8080 │ │ Port 8000 │
│ │ │ │ │ │
└─────────────┘ └────────┬─────────┘ └────────┬────────┘
│ │
┌────────▼─────────┐ ┌─────────▼────────┐
│ MySQL 8.0 │ │ Shared Volume │
│ conversion_jobs │ │ /app/videos_subi │
│ Port 3306 │ │ dos │
└──────────────────┘ └──────────────────┘
📤 Upload Video
│
▼
💾 Guardar en volumen compartido (videos_subidos/)
│
▼
🔍 Estado: ANALYZING
│ ← ai-service analiza 1 frame cada 2 segundos
│ ← Detecta rostros con OpenCV
│ ← Devuelve lista de posiciones por segmento temporal
▼
🎬 Estado: PROCESSING
│ ← FFmpeg aplica crop dinámico con interpolación lineal
│ ← El recorte sigue al sujeto suavemente
▼
✅ Estado: COMPLETED → Video vertical listo para descargar
- Docker y Docker Compose instalados
- Git
git clone https://github.com/No-Country-simulation/S02-26-09-WebApp-Converter.git
cd S02-26-09-WebApp-Converterdocker compose --profile ai up --buildEsto levanta 4 servicios:
| Servicio | Puerto | Descripción |
|---|---|---|
shortify-frontend |
3000 |
Interfaz web (Next.js) |
shortify-backend |
8080 |
API REST (Spring Boot) |
shortify-ai-service |
8000 |
Análisis de video (FastAPI + OpenCV) |
mysql-db-shortify |
3306 |
Base de datos (MySQL 8) |
docker compose up --buildSin IA, los videos se recortan centrados (sin tracking del sujeto).
# Si levantaste con --profile ai:
docker compose --profile ai down
# Para también borrar volúmenes (reset completo):
docker compose --profile ai down -v| Recurso | URL |
|---|---|
| 🌐 Frontend | http://localhost:3000 |
| 📡 API Backend | http://localhost:8080 |
| 📖 Swagger UI | http://localhost:8080/swagger-ui/index.html |
| 🤖 AI Health | http://localhost:8000/health |
El microservicio de IA (ai-service/) es el cerebro detrás del recorte inteligente.
- Extrae frames del video a intervalos regulares (cada 2 segundos por defecto)
- Detecta rostros en cada frame usando OpenCV Haar Cascade
- Calcula
crop_xpara cada momento, determinando dónde centrar el recorte - Suaviza transiciones — si pierde el rostro momentáneamente, mantiene la última posición conocida
- El backend construye una expresión FFmpeg con interpolación lineal entre puntos
Para un video de 10 segundos:
{
"segments": [
{ "time": 0.0, "crop_x": 100 },
{ "time": 2.0, "crop_x": 180 },
{ "time": 4.0, "crop_x": 320 },
{ "time": 6.0, "crop_x": 250 },
{ "time": 8.0, "crop_x": 200 }
],
"subject_found": true,
"duration": 10.0
}El resultado: una "cámara virtual" que sigue al sujeto suavemente a lo largo del video.
| Tecnología | Uso |
|---|---|
| Python 3.12 | Runtime |
| FastAPI | Framework web async |
| OpenCV (headless) | Detección de rostros |
| NumPy | Procesamiento de arrays |
| Uvicorn | Servidor ASGI |
Swagger UI completo: http://localhost:8080/swagger-ui/index.html
Sube un video y crea un job de conversión asíncrono.
curl -X POST http://localhost:8080/api/conversions/upload \
-F "file=@mi_video.mp4" \
-F "startTime=00:00:05" \
-F "endTime=00:00:30"Consulta el estado del job.
Descarga el video convertido.
Ver documentación completa en el README del Backend.
| Tecnología | Versión |
|---|---|
| Next.js | 16.1 |
| React | 19.2 |
| TypeScript | 5.x |
| Tailwind CSS | 4.x |
| Lucide React | Icons |
| pnpm | Package manager |
| Tecnología | Versión |
|---|---|
| Java | 25 |
| Spring Boot | 4.0.2 |
| Spring Data JPA | Hibernate |
| MySQL | 8.0 |
| FFmpeg | Latest |
| Springdoc OpenAPI | 3.0 (Swagger) |
| Maven | Build tool |
| Tecnología | Versión |
|---|---|
| Python | 3.12 |
| FastAPI | 0.115 |
| OpenCV (headless) | 4.11 |
| NumPy | 2.2 |
| Tecnología | Uso |
|---|---|
| Docker Compose | Orquestación |
| Docker Volumes | Almacenamiento compartido |
| Multi-stage builds | Imágenes optimizadas |
| Variable | Default | Descripción |
|---|---|---|
AI_SERVICE_ENABLED |
true |
Habilita/deshabilita el análisis IA |
AI_SERVICE_URL |
http://ai-service:8000 |
URL del microservicio de IA |
SPRING_DATASOURCE_URL |
jdbc:mysql://mysql-db:3306/db-shortify |
URL de conexión MySQL |
SPRING_DATASOURCE_PASSWORD |
1234 |
Contraseña MySQL |
| Natividad Romero UX/UI Designer |
Christian Iván Ledesma Frontend Developer |
Hector Duarte Frontend Developer |
Iván Sierra Backend Developer |
Martin Rioja Backend Developer |
Ricardo Avila Backend Developer |
Este proyecto está bajo la licencia Apache 2.0. Ver LICENSE para más detalles.