「その他/jstest4」の編集履歴(バックアップ)一覧に戻る

その他/jstest4 - (2019/03/15 (金) 21:55:46) のソース

マイク録音テスト

#html2(){{
<input type="button" id="rec" value="rec">
<input type="button" id="stop" value="stop">
<input type="button" id="play" value="play"><br>
<pre id="output"></pre>
}}
#js(){{

let ac;		// AudioContext
let prc;	// ScriptProcessorNode
let msas;	// MediaStreamAudioSourceNode
let abuf;	// AudioBuffer
let src;	// AudioBufferSourceNode

let flg = false;
let pos;

onload = function() {
	rec.onclick = on_rec;
	stop.onclick = on_stop;
	play.onclick = on_play;

	navigator.mediaDevices.getUserMedia({ audio: true, video: false })
	.then(init)
	.catch(err => {
		output.textContent = err;
	});
};

function init(stream) {
	ac = new AudioContext();

	prc = ac.createScriptProcessor(2048, 1, 1);
	prc.connect(ac.destination);
	prc.onaudioprocess = process;

	msas = ac.createMediaStreamSource(stream);
	msas.connect(prc);
}

function on_rec() {
	abuf = ac.createBuffer(1, ac.sampleRate * 10, ac.sampleRate);
	pos = 0;
	flg = true;
}

function on_stop() {
	flg = false;
}

function on_play() {
	src = ac.createBufferSource();
	src.buffer = abuf;
	src.connect(ac.destination);
	src.start();
}

function process(e) {
	let ibuf = e.inputBuffer;
	let obuf = e.outputBuffer;
	let len = ibuf.length;

	let idat = ibuf.getChannelData(0);
	let odat = obuf.getChannelData(0);

	for (let i = 0; i < len; i++) {
		odat[i] = idat[i];
	}

	if (! flg) return;
	if (pos + len > abuf.length) {
		flg = false;
		return;
	}

	let adat = abuf.getChannelData(0);

	for (let i = 0; i < len; i++) {
		adat[pos++] = idat[i];
	}

	output.textContent = pos;
}

}}