Ho recentemente scoperto che diversi video sul mio forum Discourse in self-hosted non venivano riprodotti su iPhone e iPad senza generare errori. Dopo un’indagine, ho individuato la causa principale: i video erano stati codificati con il codec VP9 all’interno di un contenitore MP4, una combinazione che iOS Safari non è in grado di riprodurre.
Come si verifica
Facebook (e probabilmente altre piattaforme) a volte fornisce video codificati in VP9 quando gli utenti scaricano i propri contenuti. Quando questi file vengono caricati su Discourse, vengono accettati senza problemi: l’estensione .mp4 non fornisce alcuna indicazione sul codec contenuto. Su browser desktop e Android i video vengono riprodotti correttamente, quindi il problema passa inosservato. Su iOS Safari, il video mostra un’anteprima e un pulsante di riproduzione, ma toccandolo appare solo un indicatore di caricamento in rotazione. Gli utenti tendono solitamente a pensare che si tratti di un problema di rete e procedono senza segnalarlo.
Perché è difficile rilevare il problema
- L’estensione del file (
.mp4) è identica a quella di un file H.264 funzionante - I browser desktop supportano VP9, quindi gli amministratori che effettuano test su desktop non rilevano alcun problema
- Gli utenti iOS spesso non segnalano singoli errori multimediali, specialmente quando altri contenuti nello stesso post sono visibili e riproducibili
- Non esiste alcun avviso o errore rivolto all’amministratore
Soluzione suggerita
Al momento del caricamento di un video, Discourse potrebbe analizzare il codec video (ffprobe è già disponibile nel contenitore Docker) e:
- Rifiutare il caricamento con un messaggio chiaro che spiega che VP9 non è supportato su iOS, chiedendo all’utente di ricodificare il video in H.264, oppure
- Trascondere automaticamente il video in H.264 al momento del caricamento (similmente a quanto fanno alcune piattaforme per normalizzare i caricamenti)
L’opzione 1 è meno complessa e rappresenterebbe già un miglioramento significativo. L’opzione 2 sarebbe ideale per un’esperienza utente senza interruzioni.
Ambiente
- Discourse in self-hosted su Docker, archiviazione locale (nessun S3)
- Versione di Discourse: 2026.4.0-latest
- Proxy inverso Apache davanti a nginx di Discourse
Soluzione temporanea
Per gli amministratori che si trovano di fronte a questo problema, la correzione richiede:
- Identificare i file VP9 con
ffprobe - Ricodificarli in H.264 con
ffmpeg -c:v libx264 -profile:v main -level 3.1 -r 30 -movflags +faststart - Aggiornare i campi
sha1,url,filesizenella tabellauploads - Aggiornare i token URL brevi
upload://nel markdown grezzo dei post interessati - Rigenerare (rebake) i post interessati
Si tratta di un processo manuale non banale che la maggior parte degli amministratori di forum non è in grado di eseguire.