Safari で X の動画や GIF が真っ黒になる
X(Twitter)の動画や GIF が、最初のコマか黒い枠のまま表示される。再生を押すと時間は進むのに、映像は黒いまま。同じ投稿が Chrome では問題なく再生される。
結論:Cmd+Q(⌘Q)で Safari を完全に終了し、もう一度開いてください。ウインドウを閉じるだけでは足りません。
症状
- x.com の GIF や動画が、最初のコマか、黒またはグレーの枠のまま。
- 再生を押すと時間は進むが、映像は黒いまま。
- 動画の直接リンク(video.twimg.com の .mp4)も黒い。新しい投稿に添付しようとしている動画のプレビューも黒い。そのファイルはまだ Mac の中にしかないのに。
- 同じ投稿が Chrome では普通に再生される。
直し方(この順番で)
- Cmd+Q で Safari を終了(または Safari ›「Safari を終了」)してから開き直します。ウインドウを閉じただけでは Safari は動き続けています。私たちの場合はこれで直りました。
- まだ黒い場合は、Mac を再起動します。
- それでも黒い場合は、Safari の機能拡張を 1 つずつオフにして(Safari ›「設定」›「機能拡張」)、そのたびに動画を確かめます。
なぜ Chrome ではなく Safari だけなのか
Chrome は動画を自分のエンジンの中でデコードして描画します。一方 Safari は、動画を別のヘルパープロセス com.apple.WebKit.GPU に渡し、macOS のメディア機能で処理します。Safari のウインドウを閉じても、このヘルパーは止まりません。私たちが遭遇した Mac では、Safari とヘルパーが 16 時間動き続けていて、ヘルパーが固まり、どの動画も黒く再生されていました。Safari を終了すれば、ヘルパーも新しく起動し直します。
ファイルやネットワークの問題ではない
- 動画のデータは届いていました。再生時間が進んでいたからです。
- ネットワークを使わない、Mac に保存した動画も黒いままでした。
- Chrome と Safari は、動画サーバについて同じアドレスを得ていました。(Cloudflare や Google の DNS を使っていると Chrome は DNS over HTTPS に切り替えることがありますが、答えは同じでした。)
確認したい場合:ヘルパーの稼働時間
アクティビティモニタで「WebKit」を検索します。または、ターミナルに次の行を貼り付けます。
ps -axo etime,comm | grep WebKit.GPU
最初の列が、各ヘルパーが動き続けている時間です(時:分:秒。1 日を超えると先頭に日数が付きます)。ほかのアプリも同じヘルパーを使うので、何行か出ることがあります。時間が長いのはヒントであって、証拠ではありません。
この問題には、Bytewell のデモを投稿しようとしたときに遭遇しました。Bytewell 自体は、Mac で開発する人のためのディスククリーナーです。