最近はWeb会議も当たり前になってきました。ですが、Web会議の始まる前の「声は聞こえてますか」「画面は見えてますか」のやりとりには未だに慣れません😅あの一瞬し〜んとなるのがなんとも、、
さて、今回はWeb会議のマイク入力がちゃんと拾えているかビジュアライズする、よくみるゲージバーをVue.jsで実装してみます。Web Audio APIを使ってやる方法もありますが、vue-audio-visualというライブラリがあるので、そちらを使ったサンプルを作ってみたいと思います💪
インストール
Nuxt3を使っていきます。vueuseも入れます。vueuseは、MediaDevicesの取得で使用します。
1 2 3 |
$ npx nuxi init visual $ cd visual $ yarn add vue-audio-visual @vueuse/core |
プラグイン設定
Nuxt3のプラグインとして設定し、ライブラリのコンポーネントの中で利用可能にします。
1 2 |
$ mkdir plugins $ touch plugins/vue-audio-visual.client.ts |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import { AVPlugin, AVBars, AVCircle, AVLine, AVWaveform, AVMedia, } from "vue-audio-visual"; export default defineNuxtPlugin((nuxtApp) => { nuxtApp.vueApp.use(AVPlugin); nuxtApp.vueApp.component("AVMedia", AVMedia); nuxtApp.vueApp.component("AVBars", AVBars); nuxtApp.vueApp.component("AVCircle", AVCircle); nuxtApp.vueApp.component("AVLine", AVLine); nuxtApp.vueApp.component("AVWaveform", AVWaveform); nuxtApp.vueApp.component("AVMedia", AVMedia); }); |
これで準備ができました。Nuxt3ではplugins
ディレクトリ配下のプラグインは自動でロードされるので、nuxt.config.ts
で指定する必要はありません。
コンポーネントでの利用
App.vueコンポーネントに組み込みんでみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<script lang="ts" setup> import { useDevicesList, useUserMedia } from "@vueuse/core"; import { Ref } from "vue-demi"; const audioInputs = reactive<{ devices: Record<string, Ref<MediaStream | undefined>>; }>({ devices: {} }); const { audioInputs: microphones } = useDevicesList({ requestPermissions: true, }); watch( () => microphones.value, () => { for (const device of microphones.value) { const { stream, start } = useUserMedia({ videoDeviceId: false, audioDeviceId: device.deviceId, }); audioInputs.devices[device.deviceId] = stream; start(); } }, ); </script> <template> <div> <template v-if="!microphones"> <p> 使用可能なデバイスを検出できませんでした。設定で使用許可されているかご確認ください。 </p> </template> <template v-else> <div v-for="i of microphones" :key="i.deviceId" class="mt-2 mb-4"> <div>{{ i.label }}</div> <AVMedia class="mt-3 mb-1" :media="audioInputs.devices[i.deviceId]" :canv-width="82" type="vbar" ></AVMedia></div ></template> </div> </template> |
vueuseのuseDevicesList
を使うとvideo、audioInput/Outputのデバイスリストを取得できます。watch
でmicrophones参照を指定し、デバイスリストをaudioInputs参照に格納しています。
表示してみましょう。
1 |
yarn dev |
http://localhost:3001にアクセスし、カメラとマイクの許可をすると、、
表示されました!音声に反応してゲージが動いていることを確認できます。
参考リンク
コメント