1. WebRTC Meetup Tokyo #14
ブラウザでiOSゲ`トウェイ恬ってみた
Build WebRTC - iOS Gateway on Browser
2017.03.23
インフォコム幄塀氏芙
がねこまさし
@massie_g
1
2. 徭失B初
? がねこまさし / @massie_g
? インフォコム幄塀氏芙 に侭奉
C 室g{砲班臘擇任寮喘を容Mするチ`ム
? WebRTC Meetup Tokyo スタッフの匯繁
? WebRTC Beginners Tokyo vの匯繁
? WebRTC秘T2016を HTML5Experts.jpにBdしてました
C https://html5experts.jp/series/webrtc2016/
2
3. 書晩のお}
? iOS のブラウザでは、まだWebRTCが聞えない
C WebkitではWebRTC鬉Mんでいる徨。が、Safariに秘るかはApple肝及
? でも、書ある室gを聞って、o尖やりコミュニケ`ションできる
C Canvas, Web Audio, WebSocket を旋喘
? 枠佩しているみを パクって 返云にしてgF
C 咄蕗 @leader22 仝WebAudioでなんちゃってWebRTC々
? http://leader22.github.io/slides/webaudio_tokyo-1/
C 鮫顳 @voluntas 仝WebRTC SFU Sora ノススメ々のスナップショットC嬬
? https://gist.github.com/voluntas/0d6621d15947a24e710b0610093a5d20
3
4. DEMO
? PC Chrome ?? iOS Safari
C ぱくたそ の亟寔を聞わせていただいています
C https://www.pakutaso.com
? ソ`スコ`ド
C https://github.com/mganeko/webrtcexpjp/tree/master/gateway
? ちょっと火廷な何蛍もありますが´
C kの亟寔が貧返くQえない
4
5. PC Chrome ? iOS Safari (1) Video
5
getUserMedia()
MediaStream
<video>
<canvas>
Blob JPEB
setInterval()
drawImage()
toBlob()
Worker
WebSocket
(socket.io)
Blob
JPEB
socket.io
Server
postMessage()
Worker
WebSocket
(socket.io)
ArrayBuffer
postMessage()
ArrayBuffer
<img>
Blob
createObjectURL()
PC Chrome iOS Safari
6. PC Chrome ? iOS Safari (2) Audio
6
getUserMedia()
MediaStream
Worker
WebSocket
(socket.io)
socket.io
Server
Worker a
WebSocket
(socket.io)
PC Chrome iOS Safari
WebAudio
ScriptProcessor [Float32Array]
MediaStreamAudioSourceNode
[Uint8Array]
compress
postMessage()
ArrayBuffer
(decompress)
WebAudio
6
AudioBufferSource
ArrayBuffer
decoceAudioData()
AudioDestinationNode
postMessage()
17. lamejsによるMP3Rs
? より咄蕗デ`タをRsするためにMP3を旋喘
? lamejs
C https://github.com/zhuker/lamejs
? ストリ`ミングではなく、俳れのMP3デ`タを伏撹
? 秘薦は 16bit 屁方の塘双
C チャネル┘好謄譽/モノ、サンプルレ`ト を峺協辛嬬
? Rs瘁は8bit屁方の塘双
C ビットレ`ト(kbps)を峺協辛嬬
C 和泙△蝪 22kHz の栽 >= 32kbps 、 24kHzの栽 >= 36kbpsぐらい
17
18. Sample from GitHub
var channels = 1, sampleRate = 44100, kbps = 128; // mono, 44.1kHz, 128kbps
var mp3encoder = new lamejs.Mp3Encoder(channels, sampleRate, kbps);
var sampleBlockSize = 1152; // better to use 576 * n
var samples = new Int16Array(44100); // 1sec sample
var mp3Data = [];
for (var i = 0; i < samples.length; i += sampleBlockSize) {
sampleChunk = samples.subarray(i, i + sampleBlockSize);
var mp3buf = mp3encoder.encodeBuffer(sampleChunk);
if (mp3buf.length > 0) { mp3Data.push(mp3buf); }
}
var mp3buf = mp3encoder.flush(); //finish writing mp3
if (mp3buf.length > 0) { mp3Data.push(new Int8Array(mp3buf)); }
18
19. lamejs 旋喘にあたっての垢健
? MP3デ`タのオ`バ`ヘッドの雙崙
C ヘッダ+タグ = 132byte
C 匯業にQする咄蕗ブロックを、なるべくLく
C WebAudioのScriptProcessorの貧(16384 サンプル/指)で函誼
? ? 370 ms (44.1kHz), 340 ms (48kHz)
19
ヘッダ Rs瘁デ`タ MP3タグ
4byte 128byte1500゛2000 byte
? Rs念のサンプルの磯p 44.1kHz★22.05kHz, 48kHz★24kHzに
? ビットレ`ト和泙燐{屁
C 和泙△蝪 22kHz の栽 >= 32kbps 、 24kHzの栽 >= 36kbpsぐらい
? WebWorkerでRs ´ 1ブロックあたり 50ms ゛ 100ms