React でブラウザ標準オーディオプレーヤ (audioタグ) の再生速度を動的に変更できるようにする

こんにちは、広野です。

ちょっと必要に迫られて、タイトル通りの機能をつくったので紹介します。

背景

HTML の要素で、音声ファイルを埋め込んで再生する audio タグがあります。

HTML ネイティブの要素なので多くのブラウザで使用可能なのですが、ブラウザによって見た目や機能が変わってしまいます。再生速度は例えば Windows の Chrome ではネイティブ実装されているのですが、iOS の Safari では実装されていません。

以下が audio 操作画面の例です。

これではユーザーの環境によって提供機能が変わってしまうため、今回はブラウザを問わず再生速度を変えられる機能をつくりたいと思いました。

つくったもの

audio 操作画面の上部に、1.0x など再生速度を選択するプルダウンメニューを作成しています。

0.5x、0.75x、1.0x、1.25x、1.5x の 5 パターンを用意し、プルダウンで変更すると再生速度が即時反映されます。

仕組み

audio は playbackRate という再生速度の設定を持っています。当然デフォルトは 1.0 倍です。

これを変更してあげればよいだけなのですが、単純に audio タグの属性に設定できない設定だったのでひと工夫が必要でした。この設定の型が double というものだったので、きちんと型変換して渡してあげる必要がありました。

React コード

import { MenuItem, FormControl, Select } from '@mui/material';

//中略

//state定義
const [playbackRate, setPlaybackRate] = useState(parseFloat("1.0"));
const [playbackRateOption, setPlaybackRateOption] = useState("1.0");

//中略

//再生速度handleChange
const handlePlaybackRate = (event) => {
  setPlaybackRate(parseFloat(event.target.value));
  setPlaybackRateOption(event.target.value);
};
  
//audio再生速度反映
useEffect(() => {
  const audioElements = document.querySelectorAll('audio');
  audioElements.forEach(audio => {
    audio.playbackRate = playbackRate;
  });
}, [playbackRate]);

//中略

//再生速度プルダウン
<FormControl sx={{m:1}} size="small">
  <Select value={playbackRateOption} onChange={handlePlaybackRate} autoWidth>
    <MenuItem value="1.5">1.5x</MenuItem>
    <MenuItem value="1.25">1.25x</MenuItem>
    <MenuItem value="1.0">1.0x</MenuItem>
    <MenuItem value="0.75">0.75x</MenuItem>
    <MenuItem value="0.5">0.5x</MenuItem>
  </Select>
</FormControl>

//中略

//audio操作画面
<audio preload="metadata" controls>
  <source src={row.uri} type="audio/mp3" />
  Your browser does not support the audio.
</audio>
  • プルダウンメニュー作成には、MUI を使用しています。
  • state を 2 種類定義しています。ひとつは double 型の速度、もうひとつはプルダウン表示用の string 型の速度です。初期設定は 1.0x です。
  • プルダウンで選択した選択肢の value は一旦 string 型で handlePlaybackRate 関数に渡されますが、その中で parseFloat で double 型に変換したものを playbackRate の state に格納しています。
  • playbackRate が更新されると発動する useEffect を定義し、その中で audio 要素のプロパティを変更する処理をしています。playbackRate が state なので、この時点で audio 操作画面が再レンダー (つまり、再生速度が画面に反映) されます。

これで再生中でもプルダウンを変えることで再生速度が動的に変わるようになりました!

まとめ

いかがでしたでしょうか。

なにげに情報が少なかったので、地味に苦労しました。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもフロントエンド開発の方が好きでして、バックエンド構築を簡単にしてくれたAWSには感謝の気持ちの方が強いです。
取得資格:AWS 認定は13資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2024 Japan AWS Top Engineer 受賞
2022 - 2024 AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする

クラウドに強いによるエンジニアブログです。

SCSKでは、自社クラウドと3大メガクラウドの強みを活かし、ハイブリッドクラウド/マルチクラウドのソリューションを展開しています。業界の深い理解をもとに、お客様の業務要件に最適なアーキテクチャをご提案いたします。サービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。

アプリケーション開発ソリューション
シェアする
タイトルとURLをコピーしました