0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AudioContext】メディアプレイヤーを騙してAppleの消音モードを貫通させる

0
Last updated at Posted at 2026-01-26

問題

JavaScript の AudioContext 、便利ですよねぇ。
一度くらいは使ったことがあるかもしれません。(というか、この記事を読んでいる時点でそうでしょう。)

AudioContext はメディアではないですから、<audio> タグと異なり、iPhone や iPad では、消音モード(マナーモード)有効化中には残念ながら音声が再生されません。

.js
button.addEventListener('click', () => {   // ユーザーの操作がないとそもそも再生されない
    const real = new Float32Array([0,1]);
    const imag = new Float32Array([0,0]);
    const ac = new AudioContext();
    const osc = ac.createOscillator();
    const wave = ac.createPeriodicWave(real, imag, { disableNormalization: true });
    osc.setPeriodicWave(wave);
    osc.connect(ac.destination);
    osc.start();                           // 消音モードでは聴こえない
});

原因

iOS 、iPadOS の仕様です。

解決策

短い無音の音声ファイルを同時に鳴らしましょう。

.html
<audio id='silentAudio' src='slient.wav'></audio>  <!--bodyに追記する-->
.js
button.addEventListener('click', async () => {
    const silentAudio = document.getElementById('silentAudio');
    const real = new Float32Array([0,1]);
    const imag = new Float32Array([0,0]);
    const ac = new AudioContext();
    const osc = ac.createOscillator();
    const wave = ac.createPeriodicWave(real, imag, { disableNormalization: true });
    osc.setPeriodicWave(wave);
    osc.connect(ac.destination);
    await silentAudio.play();              // 追記する
    osc.start();                           // 聴こえるようになる
});

ちなみに、あんまり短いと認識されないので、1秒くらいのファイルを用意しましょう。
(Audacityなどを使うと簡単に作成できます。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?