3

更新:目前最好的假设是,这在某种程度上是由大型学校/大学网络引起的——其他用户没有问题。


我正在使用 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()

还有一些细节可能有助于解决这个问题:

  1. Chrome 版本似乎不是问题:一些用户v61.0.3163.100有问题,而另一些用户则没有
    1. 对于遇到问题的用户来说,似乎每次都会发生。
    2. 显然,navigator.getUserMedia已弃用,但它仍然应该起作用——promise 的复杂逻辑可能会引入错误。

更新:

  1. 该问题发生在两个使用大型网络(大学网络和公立学区网络)的用户身上。私人家庭网络上的任何用户都没有发生这种情况......

让我知道还有哪些其他信息会有所帮助,我会立即回复。谢谢你。

更新:

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:

但它仍然无法正常工作。关于为什么这可能不起作用的想法:

  1. 我不确定 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
  }


});
};

再次感谢。

更新:

在这里包括两个遇到此问题的用户的个人资料(都是大型公立学校/大学网络)。私人家庭网络上的用户不会出现此问题:

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

1

当出现 getUserMedia 错误时,此代码将失败。改变

this.captureUserMedia((stream) => {

this.captureUserMedia((stream, err) => {

并处理设置的错误(当流为空时)。重现此问题的最简单方法可能是通过单击地址栏中最右侧的相机图标来阻止权限。

于 2017-10-12T05:31:53.703 回答
1

问题在于captureUserMedia需要访问流:

captureUserMedia(callback) {
  var params = { audio: true, video: false };
  navigator.getUserMedia(params, (stream) => {
    callback(stream)
  }, (err) =>  {
    callback(null, err)
  })
  return
}
于 2017-10-17T23:58:35.437 回答