// nodeType decides which node in graph should be the source of recording.
let node;
if (nodeType == "source") {
node = source;
} else if (nodeType == "splitter") {
const splitter = context.createChannelSplitter(); source.connect(splitter);
node = splitter;
} else if (nodeType == "destination") { source.connect(context.destination);
node = context.destination;
}
// Explicitly start offline context.
if (contextType == "offline") {
context.startRendering();
}
return node;
}
async function testRecord(source, mimeType) {
const isOffline = source.context instanceof OfflineAudioContext;
const recorder = new MediaRecorder(source, 0, {mimeType});
is(recorder.mimeType, mimeType, "Mime type is set");
const extendedMimeType = `${mimeType || "audio/ogg"}; codecs=opus`;
recorder.onwarning = () => ok(false, "should not fire onwarning");
recorder.onerror = () => ok(false, "should not fire onerror");
if (!isOffline) {
recorder.onstop = () => ok(false, "should not fire stop yet");
}
recorder.start(1000);
is("recording", recorder.state, "state should become recording after calling start()");
is(recorder.mimeType, mimeType, "Mime type is not changed by start()");
await new Promise(r => recorder.onstart = r);
is(recorder.mimeType, extendedMimeType, "Mime type is fully defined");
const chunks = [];
let {data} = await new Promise(r => recorder.ondataavailable = r);
if (!isOffline) {
is(recorder.state, "recording", "Expected to still be recording");
}
is(data.type, extendedMimeType, "Blob has fully defined mimetype");
isnot(data.size, 0, "should get data and its length should be > 0");
chunks.push(data);
if (isOffline) {
await new Promise(r => recorder.onstop = r);
is(recorder.state, "inactive", "Offline context should end by itself");
} else {
is(recorder.state, "recording", "Expected to still be recording");
recorder.stop();
({data} = await new Promise(r => recorder.ondataavailable = r));
is(recorder.state, "inactive", "Expected to be inactive after last blob");
isnot(data.size, 0, "should get data and its length should be > 0");
chunks.push(data);
await new Promise(r => recorder.onstop = r);
is(recorder.state, "inactive", "state should remain inactive after stop event");
}
return new Blob(chunks, {type: chunks[0].type});
}
addLoadEvent(async () => {
const src = setUpSource();
let didThrow = false;
try {
new MediaRecorder(src);
} catch (e) {
didThrow = true;
}
ok(didThrow, "MediaRecorder(AudioNode) should be hidden behind a pref");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.