今から説明するものは、
socket.on('audio', (payload) => {
// 送り先はともかく、ほんとに流すだけ
socket.to(payload.ch).emit('audio', payload.buf);
});
var processor = context.createScriptProcessor(
BUFFER_SIZE,
// 1: Monoral, 2: Stereo
numOfInputCh,
numOfOutputCh
);
processor.onaudioprocess = function(ev) {
var inputBuffer = ev.inputBuffer;
var outputBuffer = ev.outputBuffer;
// Float32Array
var inputData = inputBuffer.getChannelData(0);
var outputData = outputBuffer.getChannelData(0);
for (var sample = 0; sample < inputBuffer.length; sample++) {
outputData[sample] = inputData[sample];
}
// or just set
// outputData.set(inputData);
};
PCMのサンプルデータに直接アクセスできるAudioNode
var filter = context.createBiquadFilter();
// 電話はバンドパスフィルタ
filter.type = 'bandpass';
// アナログ電話は300Hz ~ 3.4kHz / ひかり電話は100Hz ~ 7kHzを使ってる
// 今回は高品質あたりに山を作る
filter.frequency.value = (100 + 7000) / 2;
// 固定ならだいたい聴き良いのがこれくらい・・?
filter.Q.value = 0.25;
最適な通過帯域は声や音によってそれぞれなので、決め打ちは気休めでしかない・・
が、コレが有るのと無いのでは大違い
new Worker('./worker.js');
// require('webworkify')(require('./worker.js'));
webworkify
socket.on('audio', this._handleAudioBuffer);
// とにかくこれがすごい呼ばれる
function _handleAudioBuffer(buf) {
var currentTime = ctx.currentTime;
// 略
// 貯まってるので未来に再生
if (currentTime < startTime) {
source.start(startTime);
startTime += audioBuffer.duration;
}
// すぐ再生
else {
source.start(startTime);
startTime = currentTime + audioBuffer.duration;
}
}
こうしないと、Socketの到着タイミングで随時再生されちゃうので、プツプツと聞けたもんじゃない!
同一WiFi上で、
Pub: Mac ⇔ Server ⇔ Sub: Mac || iPhoneの場合。
Pubの内容 | 評価 | 備考 |
---|---|---|
マイクから声 | S+ | |
動画ニュース | S+ | |
音楽 | S | さすがに音質が気になる |
サーバーをVPSに立ててみた。
Pub: Mac ⇔ Server ⇔ Sub: Mac || iPhoneの場合。
Pubの内容 | 評価 | 備考 |
---|---|---|
マイクから声 | S | 1秒くらい遅れる |
動画ニュース | S | 〃 |
音楽 | A+ | 音質は(ry |