tag:crieit.net,2005:https://crieit.net/tags/WebAudioAPI/feed
「WebAudioAPI」の記事 - Crieit
Crieitでタグ「WebAudioAPI」に投稿された最近の記事
2022-07-11T19:07:52+09:00
https://crieit.net/tags/WebAudioAPI/feed
tag:crieit.net,2005:PublicArticle/16031
2020-08-16T06:52:03+09:00
2022-07-11T19:07:52+09:00
https://crieit.net/posts/music-waves-visualizer
WebAudioAPIとcanvasで音声波形動画を出力するサイトを作ってみた
<h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2>
<p>YouTubeなどで見かけるよくあるミュージックビデオに音声波形が動いて表示されたりするのがあります。<br />
そういう動画は調べてみると、大抵はWindowsのAviUtlという無料の動画編集ソフトの拡張機能で作られてるようです。<br />
最近では、daniwell氏により<a target="_blank" rel="nofollow noopener" href="https://aidn.jp/mvg/">Music Visualization Generator</a>がWindows/Macのフリーソフトがリリースされ、簡単に音声波形動画が作れるようになりました。<br />
そういった中で、Web上でも作って共有できたら便利だなと思い、調べてみたところ、どうやらHTML5のWebAPIとJavascriptでできるようなのでやってみました。</p>
<h2 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://komura-c.github.io/music-waves-visualizer/">Music Waves Visualizer</a></p>
<p><a href="https://crieit.now.sh/upload_images/d4815e4367e4f03b703f791d465c9a6f5f3858b51166f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d4815e4367e4f03b703f791d465c9a6f5f3858b51166f.png?mw=700" alt="スクリーンショット 2020-08-14 19.41.42.png" /></a><br />
<img src="https://i.gyazo.com/1e8b95de8bd4f40e203ca3d25c42acbd.gif" alt="" /></p>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/komura-c/music-waves-visualizer/">komura-c/music-waves-visualizer</a></p>
<h2 id="実装した機能"><a href="#%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E6%A9%9F%E8%83%BD">実装した機能</a></h2>
<p>WebAPIとCanvas、Next.jsを駆使して以下を実装しました。<br />
・画像と音声の読み込み、表示<br />
・音声波形表示<br />
・動画として出力</p>
<h2 id="画像と音声の読み込み"><a href="#%E7%94%BB%E5%83%8F%E3%81%A8%E9%9F%B3%E5%A3%B0%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF">画像と音声の読み込み</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/API/FileReader/onload">FileReader.onload - Web API | MDN</a><br />
を参考にして、画像を読み込むと同時にcanvasに描画しています。<br />
音声も同様ですが、読み込み時にbase64としてデコードすることでWebAudioAPIに渡した上で、FileReaderに読み込ませています。</p>
<pre><code class="ts">// audioLoad
const LoadSample = (audioCtx, audioDataUrl) => {
fetch(audioDataUrl)
.then((response) => {
return response.arrayBuffer();
})
.then((arrayBuffer) => {
audioCtx.decodeAudioData(arrayBuffer).then((decodedData) => {
buffer = decodedData;
});
})
};
</code></pre>
<h2 id="音声波形表示"><a href="#%E9%9F%B3%E5%A3%B0%E6%B3%A2%E5%BD%A2%E8%A1%A8%E7%A4%BA">音声波形表示</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/API/Canvas_API/Drawing_graphics_with_canvas">canvas に絵を描く - Web API | MDN</a>を参考にしました。<br />
モード別に描画方法を変えることで周波数バー・折れ線・円形を実現しています。</p>
<h2 id="動画として出力"><a href="#%E5%8B%95%E7%94%BB%E3%81%A8%E3%81%97%E3%81%A6%E5%87%BA%E5%8A%9B">動画として出力</a></h2>
<p>以下の記事を参考に実装しました。<br />
<a target="_blank" rel="nofollow noopener" href="https://qiita.com/ru_shalm/items/0930aedad12c4e100446">MediaRecorder APIをつかってCanvas/WebAudioなゲーム画面を録画する</a><br />
<a target="_blank" rel="nofollow noopener" href="https://blog.ver001.com/javascript-canvas-mediarecorder/">JavaScriptでcanvasを録画して動画ファイルに保存する方法</a></p>
<p>また、上記の対応だとwebpでしか動画の出力ができませんでした。<br />
そのため、ffmpeg.wasmを使いmp4で書き出せるように対応しました。<br />
<a target="_blank" rel="nofollow noopener" href="https://github.com/ffmpegwasm/ffmpeg.wasm">https://github.com/ffmpegwasm/ffmpeg.wasm</a></p>
<pre><code class="ts">import { createFFmpeg } from "@ffmpeg/ffmpeg";
export async function generateMp4Video(
binaryData: Uint8Array,
webmName: string,
mp4Name: string
) {
const ffmpeg = createFFmpeg({ log: true });
await ffmpeg.load();
ffmpeg.FS("writeFile", webmName, binaryData);
await ffmpeg.run("-i", webmName, "-vcodec", "copy", mp4Name);
return ffmpeg.FS("readFile", mp4Name);
}
</code></pre>
<h2 id="今後の課題"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E8%AA%B2%E9%A1%8C">今後の課題</a></h2>
<ul>
<li>canvasの性質上、モバイルへの対応が難しいので知見を深める</li>
</ul>
<h2 id="参考記事"><a href="#%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B">参考記事</a></h2>
<h3 id="WebAudioAPIについて"><a href="#WebAudioAPI%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">WebAudioAPIについて</a></h3>
<p>使い方は以下を参考にしました。<br />
<a target="_blank" rel="nofollow noopener" href="https://webmusicdevelopers.appspot.com/codelabs/webaudio/index.html?ja-jp">Web Audio API | Codelab</a><br />
<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/API/Web_Audio_API#Example">Web Audio API - Web API | MDN</a><br />
<a target="_blank" rel="nofollow noopener" href="https://www.html5rocks.com/ja/tutorials/webaudio/intro/">Web Audio API の基礎</a></p>
<p>WebAudioAPIで詰まったところは、以下のように仕様書を日本語訳してくれている方がいらっしゃるので辞書代わりに参考にしました。<br />
<a target="_blank" rel="nofollow noopener" href="https://g200kg.github.io/web-audio-api-ja/">Web Audio API ( 日本語訳 )</a></p>
こむら