最近、自己ホスト型の Discourse フォーラムにあるいくつかの動画が、iPhone や iPad で再生されずに静かに失敗していることに気づきました。調査の結果、根本的な原因は、動画が VP9 コーデックでエンコードされ、MP4 コンテナに格納されていたことです。この組み合わせは iOS Safari では再生できません。
発生メカニズム
Facebook(および他のプラットフォームも同様)では、ユーザーがコンテンツをダウンロードする際に、VP9 エンコードされた動画が提供されることがあります。これらのファイルを Discourse にアップロードすると、拡張子が .mp4 であるため、内部のコーデックが何であるかを示す手がかりがなく、問題なく受け入れられます。デスクトップブラウザや Android では動画が正常に再生されるため、この問題は見過ごされがちです。一方、iOS Safari では動画にサムネイルと再生ボタンが表示されますが、タップしても回転するインジケーターが表示されるだけです。ユーザーは通常、これがネットワークの問題だと誤解し、報告せずに次の行動に移ってしまいます。
検出が難しい理由
- ファイル拡張子(
.mp4)は、正常に動作する H.264 ファイルと同一である - デスクトップブラウザは VP9 をサポートしているため、管理者がデスクトップでテストしても問題に気づかない
- iOS ユーザーは、同じ投稿内の他のコンテンツが表示され再生可能である場合、個別のメディア再生失敗を報告しないことが多い
- 管理者向けの警告やエラーメッセージが存在しない
推奨される解決策
動画のアップロード時に、Discourse が動画コーデックを検査(Docker コンテナ内には既に ffprobe が用意されています)し、以下のいずれかの対応を取ることが考えられます。
- アップロードを拒否し、「VP9 は iOS でサポートされていないため、H.264 に再エンコードしてください」という明確なメッセージを表示する
- アップロード時に動画を自動的に H.264 にトランスコードする(一部のプラットフォームがアップロードを正規化する手法に類似)
オプション 1 は実装が比較的簡単で、すでに大きな改善となります。オプション 2 は、シームレスなユーザー体験を実現するために理想的です。
環境
- Docker 上で自己ホスト型の Discourse(ローカルストレージ、S3 未使用)
- Discourse バージョン:2026.4.0-latest
- Discourse の nginx の前面に Apache リバースプロキシを配置
回避策
この問題に遭遇した管理者の場合、以下の手順で対応が必要です。
ffprobeを使用して VP9 ファイルを特定するffmpeg -c:v libx264 -profile:v main -level 3.1 -r 30 -movflags +faststartで H.264 に再エンコードするuploadsテーブル内のsha1、url、filesizeを更新する- 影響を受けた投稿の生 Markdown 内の
upload://ショート URL トークンを更新する - 影響を受けた投稿を再構築(rebake)する
これは、ほとんどのフォーラム管理者が実施できるようなものではない、複雑な手動プロセスです。