Недавно я обнаружил, что несколько видео на моём самостоятельно размещённом форуме Discourse незаметно перестали воспроизводиться на iPhone и iPad. После расследования выяснилось, что корень проблемы заключается в том, что видео были закодированы с использованием кодека VP9 внутри контейнера MP4 — комбинация, которую iOS Safari не поддерживает.
Как это происходит
Facebook (и, возможно, другие платформы) иногда доставляет видео в кодировке VP9, когда пользователи скачивают свой контент. Когда эти файлы загружаются в Discourse, они принимаются без проблем — расширение .mp4 не даёт никаких указаний на используемый внутри кодек. На настольных браузерах и Android видео воспроизводятся нормально, поэтому проблема остаётся незамеченной. В iOS Safari видео показывает миниатюру и кнопку воспроизведения, но при нажатии появляется только вращающийся индикатор. Пользователи обычно полагают, что это проблема сети, и продолжают работу, не сообщая о ней.
Почему это трудно обнаружить
- Расширение файла (
.mp4) идентично рабочему файлу с кодеком H.264 - Настольные браузеры поддерживают VP9, поэтому администраторы, тестирующие на десктопе, не видят проблем
- Пользователи iOS часто не сообщают об отдельных сбоях медиа, особенно когда другой контент в том же сообщении виден и воспроизводится
- Нет предупреждения или ошибки для администратора
Предлагаемое решение
При загрузке видео Discourse мог бы проверять кодек видео (ffprobe уже доступен в Docker-контейнере) и либо:
- Отклонить загрузку с чётким сообщением, объясняющим, что VP9 не поддерживается на iOS, и просьбой перекодировать видео в H.264, или
- Автоматически перекодировать видео в H.264 при загрузке (аналогично тому, как некоторые платформы нормализуют загрузки)
Вариант 1 менее сложен в реализации и уже стал бы значительным улучшением. Вариант 2 был бы идеален для обеспечения безупречного пользовательского опыта.
Окружение
- Самостоятельно размещённый Discourse в Docker, локальное хранилище (без S3)
- Версия Discourse: 2026.4.0-latest
- Обратный прокси Apache перед nginx Discourse
Обходное решение
Для администраторов, столкнувшихся с этой проблемой, исправление включает:
- Идентификацию файлов VP9 с помощью
ffprobe - Перекодирование в H.264 с помощью
ffmpeg -c:v libx264 -profile:v main -level 3.1 -r 30 -movflags +faststart - Обновление полей
sha1,url,filesizeв таблицеuploads - Обновление коротких URL-токенов
upload://в сыром markdown затронутых сообщений - Пересборку затронутых сообщений
Это нетривиальный ручной процесс, который большинство администраторов форумов не смогут выполнить самостоятельно.