Recientemente descubrí que varios videos en mi foro de Discourse autoalojado no se reproducían silenciosamente en iPhone y iPad. Tras investigar, la causa raíz fue que los videos habían sido codificados con el códec VP9 dentro de un contenedor MP4, una combinación que iOS Safari no puede reproducir.
Cómo ocurre
Facebook (y posiblemente otras plataformas) a veces entrega videos codificados en VP9 cuando los usuarios descargan su contenido. Cuando esos archivos se suben a Discourse, se aceptan sin problemas: la extensión .mp4 no indica el códec interno. En los navegadores de escritorio y en Android los videos se reproducen sin inconvenientes, por lo que el problema pasa desapercibido. En iOS Safari, el video muestra una miniatura y un botón de reproducción, pero al tocarlo solo aparece un indicador giratorio. Los usuarios suelen asumir que es un problema de red y continúan sin reportarlo.
Por qué es difícil de detectar
- La extensión del archivo (
.mp4) es idéntica a la de un archivo H.264 funcional. - Los navegadores de escritorio soportan VP9, por lo que los administradores que prueban en escritorio no ven ningún problema.
- Los usuarios de iOS a menudo no reportan fallos individuales de medios, especialmente cuando otro contenido en la misma publicación es visible y reproducible.
- No hay ninguna advertencia o error visible para el administrador.
Solución sugerida
Al subir un video, Discourse podría inspeccionar el códec del video (ffprobe ya está disponible en el contenedor Docker) y:
- Rechazar la subida con un mensaje claro que explique que VP9 no es compatible con iOS, pidiendo al usuario que vuelva a codificar el video a H.264, o
- Transcodificar automáticamente el video a H.264 durante la subida (de forma similar a como algunas plataformas normalizan las subidas).
La opción 1 es menos compleja y ya supondría una mejora significativa. La opción 2 sería ideal para una experiencia de usuario fluida.
Entorno
- Discourse autoalojado en Docker, almacenamiento local (sin S3)
- Versión de Discourse: 2026.4.0-latest
- Proxy inverso Apache frente al nginx de Discourse
Solución alternativa
Para los administradores que se encuentren con esto, la corrección implica:
- Identificar archivos VP9 con
ffprobe - Volver a codificarlos a H.264 con
ffmpeg -c:v libx264 -profile:v main -level 3.1 -r 30 -movflags +faststart - Actualizar
sha1,urlyfilesizeen la tablauploads - Actualizar los tokens de URL corta
upload://en el markdown crudo de las publicaciones afectadas - Rehornear las publicaciones afectadas
Este es un proceso manual no trivial del que la mayoría de los administradores de foros no estarían equipados para llevarlo a cabo.