leaysgur / opus.js-sample

Javascript Opus Encoder/Decoder, Speexdsp based Resampler and WebAudio Player Sample

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

libopus.js

非可逆音声符号形式であるOpusのJavaScript実装と, Webブラウザを用いてOpusのエンコード・デコードを行うサンプルです.

TypeScriptで記述しています.

Demo: https://kazuki.github.io/opus.js-sample/index.html

詳細

OpusのJavaScript実装は,Xiph.org Foundationによる Opusの実装Emscriptenを使ってコンパイルしたものです.

Webブラウザを用いてOpusのエンコード・デコードを行うサンプルでは, ローカルに保存してあるRIFF PCM Waveファイルを再生したり, そのファイルを利用して,エンコード速度・デコード速度を測定するほか, エンコード結果をデコードし,その結果を再生することが出来ます.

このエンコード・デコード機能のサンプルでは, WebWorkerを利用し別スレッドでエンコード・デコード処理を行うため, ブラウザの他の処理に影響を与えません. また,Opusのデコード負荷がそれほど高くないことと, Emscriptenが出力するasm.jsは高速に動作するため,スマートフォン上でもOpusのリアルタイムデコードが可能です.

Opusは限られたサンプリングレートにしか対応しておらず, また,WebAudioのAudioContextは環境に依存したサンプリングレートでしか動作しないため, このサンプルではSpeexのリサンプラーを利用してサンプリングレートを合わせています.

各種バージョン

  • opus: master (3a1dc9dc, Tue Aug 4 15:24:21 2015 -0400)
  • speexdsp: 1.2rc3 (887ac103, Mon Dec 15 01:27:40 2014 -0500)
  • emscripten: v1.34.8

ビルド方法

Makefileを用意してありますので,以下のコマンドを実行してください. 事前にemscriptenの各種実行ファイルにパスを通す必要があります. また,opus/speexdspがgcc等を使って普通にビルドできる環境である必要が有ります.

$ git clone --recursive https://github.com/kazuki/opus.js-sample.git
$ cd opus.js-sample
$ make

ライセンス

修正BSDライセンス

TODO

  • Worker(this)
  • Module deps for Emscripten
  • Actural Emscripten modules

Reading

main.ts

  • HTMLにあるボタンをapp.tsに結ぶだけ
  • bypassかopusかどちらか選べる

app.ts

  • マイクかファイルかInput音源を取得
  • そこからPCMを読み出して、player.tsにつなぐ
  • player.tsを初期化してstart()する
  • main.tsからbypassが選ばれれば、そのままInputをOutputに流す(リサンプルのみ)
  • main.tsからopusが選ばれれば、InputをEncodeしてDecodeしてOutputに流す(リサンプルもする)

microphone.ts

  • マイクをgUM()する
  • 専用のringbufを持つ
  • ストリームはScriptProcessorNodeに対してつないで、PCMをringbufに貯めておく
  • read()で外から読み出される

riff_pcm_wave.ts

  • それのファイル音源ver

player.ts

  • 専用のringbufを持つ
  • ScriptProcessorNodeでそれを読み出して再生する
  • ringbufは外からenqueue()されたときに貯まる
  • onneedbufferイベントを定期的に発火する
  • これを受けた外側がenqueue()してくれる

ring_buffer.ts

  • リングバッファの自前実装

resampler.ts

  • speex_resampler.tsを使ったリサンプラー
  • 中身は丸投げ

speex_resampler.ts

impl.ts

  • opus_decoder.ts or opus_encoder.tsのWorkerを抱える
  • 中身はほぼ丸投げ

opus_encoder.ts

opus_decoder.ts

About

Javascript Opus Encoder/Decoder, Speexdsp based Resampler and WebAudio Player Sample

License:BSD 3-Clause "New" or "Revised" License


Languages

Language:TypeScript 92.2%Language:Makefile 5.4%Language:JavaScript 2.4%