Ogg

vorbis-encoder-jsをリリース

  • POST
Browserify を利用する vorbis-encoder-js をリリースしたので、 履歴とハマリポイント等を備忘録として書き残していく。 既存のライブラリでは何が足りなかったのか higuma/ogg-vorbis-encoder-js - GitHub Garciat/libvorbis.js - GitHub 上記どちらのライブラリでも AudioBuffer から Ogg Vorbis 形式の音楽ファイルを生成し、DLさせる所までは実現した。 しかし、元々想定される用途が Web Audio API を利用して、マイクからの音声データをDLする所がゴールだったようで、 タグ情報を埋め込む事考えられておらず、任意のタグ情報が埋め込めない。 また、モダンなプロジェクトなら Browserify や webpack の事は考慮に入れると思うのだが、そうでもないらしく微妙に使い勝手が悪い。 最初のコミットが1年も2年も前なので仕方ない側面もある。 そういった経緯から要望を満たすライブラリが無かったので、 GitHub で公開されている既存プロジェクトのソースコードを参考に作る事にした。 要件 Node.js での利用を想定する JavaScript での利用は Browserify を利用する 任意のタグ情報を設定出来ること ビルド環境の構築は頑張らない ログ libvorbis のビルド libvorbis はC言語で書かれているので、JavaScriptに変換するために Emscripten を経由する必要がある。 もともとC言語で書かれたライブラリを任意の言語に変換して使おうという要望は LLVM というプロジェクトで実現されており、 Emscripten は LLVM が生成した中間コードを JavaScript に変換する機能に特化している。 従って、あれやらそれやらのインストールが必要で、 いつまで経ってもコンパイルが通る環境が作れない! 参考リンク:emscriptenで遊んでみた - kashiの日記 結局 Emscripten に特化したコンテナは Docker Hub で公開されていたので利用することにした。

Oggを取り巻くメタ情報管理

  • POST
音楽ファイルにはアーティスト情報等のメタ情報を埋め込んでいる事が多い。 ゲーム音楽のループBGM絡みで勉強することになったのでそのまとめ。 ファイルにメタ情報を埋め込む そもそもファイル内にメタ情報を埋め込むという発想はWAV形式やAIFF形式の時代から既に採用されていたようだ。 これらのファイルフォーマットはコンテナ形式で動作するため、コーデックとセットで動かす事は可能。 しかしリニアPCMをそのままぶち込むものとして認識されてしまった事で、ファイルサイズばかり無駄にデカイ使えない形式として認識されてしまったようだ。 1993年にMP3(MPEG-1 Audio Layer-3)が登場。 MD(ATRAC)に迫る圧縮率を叩き出し、PCの音楽ファイルフォーマットはこれ一色になった。 更にiPodが2001年に登場、アメリカそして日本でも爆発的に普及した。 MP3ではアーティスト情報等を管理したいという要望が生まれた。 1996年に独自実装していた「Studio3」というソフトウェアに乗っかる形でID3という形で仕様が決定された。 そういった意味では、アーティスト情報をファイルに埋め込む文化はMP3が起源といえるだろう。 参考リンク: 【音源管理の精髄】 WAVでリッピングするとタグはどうなる? 【ネットワークオーディオTips】 WAV - Wikipedia WAV ファイルフォーマット - 前田稔(Maeda Minoru)のプログラム入門 その103「WAVの構造と現状」 - BB Watch AIFF - Wikipedia MP3 - Wikipedia ID3タグ - Wikipedia オーディオ符号化とその応用 - これまでの25年と今後の展望 - ミニディスク - Wikipedia ATRAC - Wikipedia iPod - Wikipedia Ogg のメタ情報に関して Ogg VorbisではVorbisCommentという規格が使用されている。 Ogg Flacと構造は殆ど同じだと思うので、Flacの解説サイトのリンクも抜粋。 参考リンク: Vorbis - Wikipedia VorbisComment - xiph.org Flacファイルのメタデータ(タグ)構造 - 白旗製作所 おまけ:LOOPSTART、LOOPLENGTHに関して Ogg VorbisではコメントにLOOPSTART、LOOPLENGTHという値を格納すると、 一部プレイヤーではループ再生を行ってくれる。

JavaScriptでOggをエンコードする

  • POST
JavaScriptでOggのエンコードがしたいので調査した結果の備忘録。 結論から言えば下記のようなプロジェクトが既にあるらしいので、順番に試していく予定 higuma/ogg-vorbis-encoder-js - GitHub Garciat/libvorbis.js - GitHub brion/ogv.js - GitHub 基礎調査 ogg javascriptでぐぐったら解決。 そのものズバリな記事がヒットした。 ogv.jsがすごい - necotech blog JavaScriptでOgg VorbisとかWebMとかをデコードするライブラリ Emscriptenを使って、Cのライブラリ(liboggzとかlibtheoraとか)をJavaScriptのコードにコンパイルしてる どうやらOggのライブラリはC言語で作られているようでJavaScriptにコンパイルし直せばブラウザ上でデコード/エンコードが出来るというわけか。 (クロスプラットフォームにするなら当然か) Emscriptenに関してもちょっと調べてみた Emscriptenとは EmscriptenでC言語をJavaScriptに変換する - Qiita Emscriptenとは EmscriptenはC/C++言語からLLVMを生成し、それをJavaScriptに変換するコンパイラのことです。 C言語の標準ライブラリやPOSIXの一部もサポートし、OpenGL ES2.0も使えるそうです。 Write once, run anywhereって奴か。 プロジェクトに関して Emscriptenなる便利なコンパイラが存在するのであれば、さぞかしプロジェクトは沢山ありそうだ。 その通りなようで、GitHubでプロジェクトが色々とヒットした。 higuma/ogg-vorbis-encoder-js - GitHub Garciat/libvorbis.js - GitHub brion/ogv.js - GitHub ざっと読んだ限り、higuma氏のプロジェクトが一番簡潔で使いやすそうな気がした。 楽曲のタイトルやアーティスト情報、LOOPSTART等のタグ情報を入れて行きたいので、組み合わせ次第といったところか。 実際に動かしてみる必要がありそうだ。