更新:目前最好的假设是,这在某种程度上是由大型学校/大学网络引起的——其他用户没有问题。
我正在使用 RecordRTC 录制音频。这依赖于 MediaRecorder。
首次开始录制时,会记录此(捕获的)错误:
DOM exception: failed to execute start on Media recorder: The
MediaRecorder failed to start because there are no audio or video
tracks available
在此之前,RecordRTC 调用 MediaRecorder API:
Using recorderType:MediaStreamRecorder
Passing following config over MediaRecorder API.Object {audio: "true", mimeType: "audio/webm", checkForInactiveTracks: "true", type: "audio", initCallback: "[object Function]"}
这是代码中的回溯。它从调用startRecording
(在 redux 传奇中)开始:
const recorder = yield select(getRecorder)
yield call(recorder.startRecording)
这里是startRecording
startRecording = () => {
try {
this.captureUserMedia((stream) => {
try {
this.rtcRecorder.startRecording()
this.recording = true
} catch (err) {
sendEmail(err, "inner startRecording failed", "support@gmail.com")
console.log("inner startRecording ERROR: ", err)
}
});
} catch (err) {
sendEmail(err, "startRecording failed", "support@gmail.com")
console.log("startRecording ERROR: ", err)
}
}
这是captureUserMedia
:
captureUserMedia(callback) {
var params = { audio: true, video: false };
navigator.getUserMedia(params, callback, (error) => {
// alert(JSON.stringify(error));
console.log('USER MEDIA ERROR:: ' + JSON.stringify(error))
callback(null, error)
});
};
该错误似乎发生在这一行,特别是startRecording
:
this.rtcRecorder.startRecording()
还有一些细节可能有助于解决这个问题:
- Chrome 版本似乎不是问题:一些用户
v61.0.3163.100
有问题,而另一些用户则没有
- 对于遇到问题的用户来说,似乎每次都会发生。
- 显然,
navigator.getUserMedia
已弃用,但它仍然应该起作用——promise 的复杂逻辑可能会引入错误。
更新:
- 该问题发生在两个使用大型网络(大学网络和公立学区网络)的用户身上。私人家庭网络上的任何用户都没有发生这种情况......
让我知道还有哪些其他信息会有所帮助,我会立即回复。谢谢你。
更新:
Muaz Khan 建议添加一个隐藏的音频元素,以防止流和轨道被停止/释放。这是在捕获流之前添加的附加代码(首次初始化记录器时):
var hiddenAudio = document.createElement('audio');
hiddenAudio.srcObject = stream // this line is required to make sure stream tracks aren't stopped/released
hiddenAudio.muted = true
hiddenAudio.play()
更新 2:
但它仍然无法正常工作。关于为什么这可能不起作用的想法:
- 我不确定 hiddenAudio HTML 元素实际上是否在持续并捕获流。(它的范围可能不正确。)
我想知道回调地狱中是否存在细微的错误,navigator.getUserMedia
并且使用更新的navigator.mediaDevices getusermedia
(依赖于承诺)会更容易遵循。
另一种可能性是在初始化记录器时引入了错误——这里是:
initialize = (callback) => {
if (!!this.rtcRecorder) {
console.log('Attempted to initialize an already initialized recorder but that\'s expected')
return
}
console.log('initialize Recorder -- requestUserMedia')
this.captureUserMedia((stream, error) => {
if (error) {
console.log('!!errror capturing user media!!')
return callback && callback(error)
}
// TODO: detect if system can play webms
// <-- smaller filesize
// this.rtcRecorder = RecordRTC(stream, { recorderType: RecordRTC.StereoAudioRecorder, bitsPerSecond: 30000, numberOfAudioChannels: 1, mimeType: 'audio/wav' });
try {
// the MUAZ KHAN edits
var hiddenAudio = document.createElement('audio');
hiddenAudio.srcObject = stream // this line is required to make sure stream tracks aren't stopped/released
hiddenAudio.muted = true
hiddenAudio.play()
this.rtcRecorder = RecordRTC(stream, { audio: 'true', mimeType: 'audio/webm', checkForInactiveTracks: 'true' });
callback && callback(null)
return true
} catch (err) {
sendEmail(err, "captureMedia (inner-most) startRecording failed", "support@gmail.com")
console.log("captureMedia (inner-most) startRecording ERROR: ", err)
callback && callback(null)
return true
}
});
};
再次感谢。
更新:
在这里包括两个遇到此问题的用户的个人资料(都是大型公立学校/大学网络)。私人家庭网络上的用户不会出现此问题: