クロスブラウザーオーディオビジュアライゼーションを作成する

約1年前、 美しい html5オーディオプレーヤーを作成するタスクがありました。 デザイナーは最も単純な視覚化を引き出しました。

画像

最も簡単なオプションは、音楽の再生とは関係のない「ノイズ」をバックグラウンドで描画することです。 しかし、私たちは簡単な方法を探していません。

habrには、 HTML5でのオーディオの視覚化の記事があり、javascriptを使用した視覚化の問題が詳細に検討されています。 オーディオに関する情報を取得するための2つの標準があります。


標準は互いに非常に異なるため、これらのAPIを使用すると、これらのブラウザーでのみサポートを取得できます。 リストを拡張したいと考え、古いバージョンのIEでも機能するソリューションを考え出しました。

簡易デモ


すべての音楽はサードパーティのサービスからインポートされ、ルビーで書かれた前処理を受けました-ステレオmp3 128kbへの変換。 これに、レンダリング用のjsonファイルの作成を追加しました。

サーバー側


図では、30の列が周波数範囲の「彩度」を示しています。左が低周波数、右が高周波数です。

アルゴリズムの詳細に入らず、サーバー上で、2つのgem - wavefileを使用して.wavファイルからデータを取得し、 fftw3を使用して高速フーリエ変換を計算し、次の形式のjsonを生成しました。

{ //   —    0.0: [/*  30 */], 0.04: [...], 0.08: [...] ... } 


視覚化ファイルの平均サイズは500kbです。

実験的に、0.04秒の「解像度」を選択しました。この場合、視覚化がスムーズに変化します(1秒あたり24フレームを覚えていますか?)。ファイルサイズは増加しません。 楽しい事実:最初の実装では、列の高さはドット付きの数値で表され、ファイルサイズは5メガバイトに達しました。 整数にキャストを追加すると、ファイルサイズが10分の1に減少しました。

クライアント側


クライアントでは、アルゴリズムは明らかです。サーバーからの各オーディオファイルに対して、jsonの視覚化が行われます。 再生中、近い将来ファイルから現在の時間が取得され、30の列が描画されます。その高さはサーバーで計算されます。

短所と長所


アプローチの明らかなマイナス点:ビジュアライゼーションの外観を変更するには、すべてのファイルを再生成する必要があります。 しかし、一年の間、外観は変わらず、そのような問題は発生しませんでした。 もう1つのマイナス点:オーディオごとに、半メガバイトの視覚化ファイルも保存する必要があります。 しかし同時に、視覚化はすべてのブラウザーで機能します。

Source: https://habr.com/ru/post/J196668/


All Articles