Concat
Un'alternativa gratuita a CapCut che lavora sul tuo computer
Cosa fa
Programma di montaggio video gratuito e open source, che lavora sul computer dell'utente senza caricare i video online.
Come guadagna
Progetto open source su GitHub con oltre 11.000 stelle, che non dichiara incassi. Ha licenza AGPL: puoi partire dal suo codice, ma se offri la tua versione online devi pubblicare anche il tuo codice modificato. Idee nostre per guadagnare: modelli e effetti a pagamento, versione per scuole e associazioni.
Rendilo tuo
- Non competere con un montatore completo: fai uno strumento per un solo tipo di video, come i video degli annunci immobiliari.
- Modelli pronti in italiano per i social delle attività.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Monta Facile": un montaggio video semplice che lavora nel browser sul computer dell'utente: si mettono in fila le clip, si tagliano inizio e fine, si aggiungono titoli e musica, e si esporta un unico video, senza caricare nulla online. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina principale: trascina le clip
2. Linea del tempo con le clip in fila, da riordinare e tagliare
3. Titoli e testi sopra il video, musica di sottofondo
4. Esportazione con avanzamento
5. Pagina Pro
Stile: da montaggio: sfondo grafite #1F2937, linea del tempo con clip colorate, cursore rosso #EF4444, carattere "Inter", anteprima grande in alto. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- nessun video viene caricato: il progetto resta nel browser
- "profili": piano
Regole di sicurezza obbligatorie:
- i video restano sul computer dell'utente
- il piano non si modifica dal browser
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Clip in fila ed esportazione
L'utente trascina le clip; per ognuna si leggono durata e risoluzione. Sulla linea del tempo si riordinano trascinandole e si tagliano trascinando i bordi; l'anteprima usa il player del browser con i tempi di inizio e fine.
L'esportazione usa ffmpeg.wasm: ogni clip viene tagliata e portata alla stessa risoluzione e frequenza dei fotogrammi, poi tutte vengono unite in un unico file (codice nei Dettagli tecnici). Titoli e musica si aggiungono nello stesso passaggio.
Il progetto (ordine, tagli, titoli) si salva nel browser per riprenderlo dopo, ma i video restano solo sul computer.
4. Formati e Pro
Esportazione in orizzontale 16:9, verticale 9:16 per i social o quadrato, fino a 1080p.
Pro: esportazione in 4K, transizioni (dissolvenza), più tracce audio, sottotitoli da file SRT, e nessuna filigrana.
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 9,99 € una volta sola. Il pagamento sblocca il 4K, le transizioni, più tracce audio, i sottotitoli e toglie la filigrana.
A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente indicata in client_reference_id.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Unione: monta 3 clip girate con telefoni diversi (risoluzioni e orientamenti diversi): il video finale deve avere un formato unico e l'audio sincronizzato.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Tagliare e unire le clip
Ogni clip viene tagliata e uniformata (risoluzione, fotogrammi, audio), poi ffmpeg le unisce in un unico video con il filtro concat.
import { FFmpeg } from "@ffmpeg/ffmpeg";
import { fetchFile } from "@ffmpeg/util";
type Clip = { file: File; inizio: number; fine: number }; // secondi
export async function esporta(clip: Clip[], larghezza = 1920, altezza = 1080, onAvanzamento?: (p: number) => void) {
const ffmpeg = new FFmpeg();
if (onAvanzamento) ffmpeg.on("progress", ({ progress }) => onAvanzamento(Math.round(progress * 100)));
await ffmpeg.load();
const ingressi: string[] = [];
const filtri: string[] = [];
for (let i = 0; i < clip.length; i++) {
const nome = "clip" + i;
await ffmpeg.writeFile(nome, await fetchFile(clip[i].file));
ingressi.push("-ss", String(clip[i].inizio), "-to", String(clip[i].fine), "-i", nome);
// Stessa misura (con bande nere se serve), 30 fotogrammi, audio stereo 48 kHz
filtri.push(
"[" + i + ":v]scale=" + larghezza + ":" + altezza + ":force_original_aspect_ratio=decrease," +
"pad=" + larghezza + ":" + altezza + ":(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30[v" + i + "];" +
"[" + i + ":a]aresample=48000,aformat=channel_layouts=stereo[a" + i + "]",
);
}
const unione = clip.map((_, i) => "[v" + i + "][a" + i + "]").join("") + "concat=n=" + clip.length + ":v=1:a=1[v][a]";
await ffmpeg.exec([
...ingressi,
"-filter_complex", filtri.join(";") + ";" + unione,
"-map", "[v]", "-map", "[a]",
"-c:v", "libx264", "-preset", "veryfast", "-crf", "23", "-c:a", "aac", "-b:a", "160k",
"finale.mp4",
]);
return new Blob([await ffmpeg.readFile("finale.mp4")], { type: "video/mp4" });
}
Pezzi comuni a tutti i progetti
Glossario
- ffmpeg.wasm
- Il programma FFmpeg per lavorare i video, adattato per girare dentro il browser.
- Linea del tempo
- La striscia su cui si mettono in fila le clip di un montaggio.