我想通过 WebRTC 发送自定义音频字节,这就是为什么我需要使用自己的 MediaTrack 编写自定义 getUserMedia 方法。现在的样子:
exports.navigator.getUserMedia = getUserMedia;
function getUserMedia (constraints, successCallback) {
console.log("window navigator: ", exports.parent.navigator);
console.log("call getUserMedia callback method callback = ", successCallback)
console.log("createMediaStreamSource is: ", exports.AudioContext.prototype.createMediaStreamSource);
return new Promise(function(resolve, reject) {
postMessage('WKWebViewGetUserMediaShim_MediaStream_new', constraints, function (trackData) {
var stream = new MediaStream()
for (var i in trackData) {
var data = trackData[i]
var track = new MediaStreamTrack()
track.id = data.id
track.kind = data.kind
track._meta = data.meta
track._stream = stream
console.log("track in promise = ", track);
stream._tracks.push(track)
exports.parent.navigator.tracks[track.kind] = exports.parent.navigator.tracks[track.kind] || {}
exports.parent.navigator.tracks[track.kind][track.id] = track
console.log("tracks in promise = ", tracks);
}
console.log("success callback = ", successCallback)
resolve(stream)
}, function(error){reject(error)})
});
}
getUserMedia._onmedia = function (kind, data) {
var tracksByKind = exports.parent.navigator.tracks[kind]
if (kind === 'audio') {
data = new Float32Array(base64ToData(data))
} else if (kind === 'video') {
data = data
}
// console.log("onmedia tracks ", exports.parent.navigator.tracks);
for (var i in tracksByKind) {
var track = tracksByKind[i]
// console.log("data came with data ", data);
// console.log("track = : ", track);
track._ondataavailable && track._ondataavailable(data)
}
}
_onmedia 方法是我获取自定义字节的地方,而 getUserMedia 我正在尝试 stub 。但我不知道如何正确地将自定义字节流设置为 MediaStreamTrack 类。
最佳答案
要从网络浏览器生成音频,请使用 Web Audio API 。 有多种方法可以让您生成合成声音。
如果您希望控制每个样本,您可以使用 ScriptProcessorNode 并为其提供 AudioProcessEvent的outputBuffer
。
Web Audio API 甚至有一个 MediaStreamAudioDestinationNode 对象,允许在 MediaStream 对象内输出生成的音频:
btn.onclick = start;
function start() {
const ctx = new (window.AudioContext || window.webkitAudioContext);
const processor = ctx.createScriptProcessor(256,1,1);
processor.onaudioprocess = makeSomeNoise;
const streamNode = ctx.createMediaStreamDestination();
processor.connect(streamNode);
const mediaStream = streamNode.stream;
// for demo output to a MediaElement
aud.srcObject = mediaStream;
aud.volume = 0.5;
aud.play();
}
function makeSomeNoise(evt) {
const output = evt.outputBuffer.getChannelData(0);
// loop through the 4096 samples
for (let sample = 0; sample < output.length; sample++) {
// noise
output[sample] = (Math.random() - 0.5) * 0.5;
}
}
<button id="btn">start</button>
<audio id="aud" controls></audio>
关于javascript - 如何实现 JavaScript getUserMedia stub 来发送自定义音频字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749339/