star back image
people4
電飾 電飾
moon
astronaut

iOS「低電力モード」のSafariでautoplayのvideoタグのposter画像に再生アイコンが出るのを回避したい

BLOG WEBログ
読了約:11分

videoタグの動画が再生できなかった時(または再生されるまでの間)、poster画像が表示されます。

ある日、autoplayの箇所で「再生アイコン」を非表示にしたいと来ました。もちろん自動再生箇所なので再生アイコンは必要なく、配置もしていません。

「自動再生されてますよ。」というと、「低電力モードにした時です。」と言うのです。

え?なんで省電力モードに。

poster画像を確認するのに省電力モードにしているのでしょう。

【調査】Safariだけにある現象かもしれない

検索したところ、どうしても出力されてしまうようです。

参考:iOS11の「低電力モード」で、HTML5 videoのautoplayが動作しない
https://qiita.com/gecko655/items/a25f25ce9e30d64f3dde

再生をするかどうか「選択をさせるモード」に切り替わるようです。
videoタグのposterのど真ん中に再生ボタンを表示させるというもの。

cssとかで非表示にできないのか

cssで-webkit-media-controls: none !important;を試す。
<video>にcontrols=”false”付けて試す。とかしてみましたが、controls=”false”付けると、再生マークから変わって一時停止アイコンが表示される始末です。

何をやってもダメでイライラ。

AIの返答はvideoの仕様は清くあきらめるに1票でした。

【葛藤】どうでもいい自分の気持ち

葛藤が生まれました。
Safariだけとはいえ仕様ですし、こんなアイコン1つを非表示にすることに時間を割いていいのかと。しかし。。

画像のど真ん中にある再生マークは、ブランドの価値を下げる恐れもあります。

メインビジュアルのような部分ですからね。

疑問も浮かびます。はたしてブランド物を買うような人達に、スマホを省電力モードにするような人はいるのでしょうか。

そしてブランド物なんて買えないレベルにある自分に、悲壮感のような気持ちも芽生えます。1人でよかった。

あなたはユニクロでいいんじゃないですかw

【共有】回避ソースコード

別立てで画像を用意して差し替えるいう内容になります。
consoleログ付き。

要件は以下です。

  • videoタグのposter画像と、別立ての画像、両方を準備
  • Safari検出(Safari以外では処理をスキップ)
  • autoplay試行(成功/失敗で分岐)
  • 自動切り替え(低電力モード検出時は即座に静止画表示)
<video data-poster-pc="sample_pc.jpg" poster="sample_sp.jpg" muted="" playsinline="" loop="loop" class="js-about-video" autoplay>
    <source media="(max-width: 767px)" src="sample_sp.mp4" type="video/mp4">
    <source media="(min-width: 768px)" src="sample_pc.mp4" type="video/mp4"></source>
</video>

<!-- 低電力モード時の代替画像 -->
<div class="low-power-fallback" style="display: none;">
  <picture>
    <source media="(max-width: 767px)" srcset="sample_sp.jpg">
    <img src="sample_pc.jpg" alt="" style="width: 100%; height: 100%; object-fit: cover;">
  </picture>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
  // Safari低電力モード検出とフォールバック処理
  function detectLowPowerMode() {
    const video = document.querySelector('.js-about-video');
    const fallback = document.querySelector('.low-power-fallback');
    
    if (!video || !fallback) return;
    
    // Safari検出
    const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
    
    if (!isSafari) return; // Safari以外では処理しない
    
    // autoplay試行による低電力モード検出
    let lowPowerDetected = false;
    
    // 1. autoplay Promise ベースの検出
    const playPromise = video.play();
    
    if (playPromise !== undefined) {
      playPromise.then(() => {
        // autoplay成功 - 通常モード
        console.log('Safari autoplay成功 - 通常モード');
        video.style.display = 'block';
        fallback.style.display = 'none';
      }).catch(error => {
        // autoplay失敗 - 低電力モードの可能性
        console.log('Safari autoplay失敗 - 低電力モード検出:', error);
        showFallbackImage();
      });
    }
    
    // 2. 再生状態監視による検出
    let playCheckTimeout = setTimeout(() => {
      if (video.paused && video.currentTime === 0) {
        console.log('Safari 再生開始されず - 低電力モード検出');
        showFallbackImage();
      }
    }, 1000);
    
    // 3. 再生開始イベント監視
    video.addEventListener('playing', () => {
      clearTimeout(playCheckTimeout);
      video.style.display = 'block';
      fallback.style.display = 'none';
      console.log('Safari 動画再生開始 - 通常モード');
    });
    
    // 4. エラーイベント監視
    video.addEventListener('error', () => {
      console.log('Safari 動画エラー - フォールバック表示');
      showFallbackImage();
    });
    
    function showFallbackImage() {
      if (!lowPowerDetected) {
        lowPowerDetected = true;
        video.style.display = 'none';
        fallback.style.display = 'block';
        console.log('Safari 低電力モード対応: 静止画像を表示');
        
        // body にクラスを追加してCSS制御も可能
        document.body.classList.add('safari-low-power-mode');
      }
    }
  }
  
  // 検出実行
  detectLowPowerMode();
});
</script>
</div>

以上になります。

iosがいつまでこの仕様なのかわかりませんし、探せば方法は色々とあるとは思いますが。

参考程度にどうぞ。

星間旅路のメロディ

「宇宙の静けさに包まれながら、漂流する過去の音楽を捜し求め、銀河の奥底でその旋律に耳を傾ける。」

「この電波はどこの星からきたのだろうか。」

どこかで聞いたことがあるような。