Почему не запускается MediaRecorder? (ошибка: нет доступных аудио- или видеодорожек) RecordRTC

ОБНОВЛЕНИЕ: текущая лучшая гипотеза состоит в том, что это каким-то образом вызвано большими сетями школ / университетов - другие пользователи не имеют проблемы.


Я использую 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 (в саге о сокращении):

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", "[email protected]")
      console.log("inner startRecording ERROR: ", err)
    }
  });
} catch (err) {
    sendEmail(err, "startRecording failed", "[email protected]")
    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 version does not seem to be the problem: some users with v61.0.3163.100 have the problem, while others don't
    1. For the users who experience the problem, it seems to occur every time.
    2. Очевидно, navigator.getUserMedia устарел, но он все равно должен работать - сложная логика обещания может привести к ошибке.

ОБНОВИТЬ:

  1. Проблема произошла с двумя пользователями, которые были в больших сетях (сеть университета и сеть школьного округа). Этого еще не произошло ни с одним пользователем, который был в частных домашних сетях ....

Сообщите мне, какая еще информация будет полезна, и я немедленно отвечу. Спасибо.

ОБНОВИТЬ:

Муаз Хан предложил добавить скрытый аудиоэлемент, чтобы предотвратить остановку / выпуск потока и треков. Вот дополнительный код, который был добавлен перед захватом потока (при первой инициализации рекордера):

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. Я не уверен, что HTML-элемент hiddenAudio на самом деле сохраняется и захватывает поток. (Это могло быть неправильно определено.)

Мне остается только гадать, есть ли тонкая ошибка в аду обратного вызова 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", "[email protected]")
    console.log("captureMedia (inner-most) startRecording ERROR: ", err)
    callback && callback(null)
    return true
  }


});
};

Еще раз спасибо.

ОБНОВИТЬ:

Включая сюда профили двух пользователей, у которых возникла эта проблема (оба из крупных сетей государственных школ / университетов). Проблема не возникает с пользователями частных домашних сетей:

введите здесь описание изображения  введите описание изображения здесь


person Phil    schedule 12.10.2017    source источник
comment
Вы нашли обходной путь? У нас такая же проблема в школах.   -  person Kenzo    schedule 30.11.2018
comment
Не знаете, как школьная сеть повлияет на локальную запись?   -  person Ryan DuVal    schedule 15.11.2019


Ответы (2)


Проблема была в captureUserMedia, которому требовался доступ к потоку:

captureUserMedia(callback) {
  var params = { audio: true, video: false };
  navigator.getUserMedia(params, (stream) => {
    callback(stream)
  }, (err) =>  {
    callback(null, err)
  })
  return
}
person Phil    schedule 17.10.2017
comment
Я использую navigator.mediaDevices.getUserMedia с обещаниями, и все еще есть пользователи (хотя и не очень многие), которые сталкиваются с этой ошибкой. - person Ryan DuVal; 15.11.2019

Этот код завершится ошибкой при ошибке getUserMedia. Изменять

this.captureUserMedia((stream) => {

to

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

и обработать установленную ошибку (пока поток равен нулю). Самый простой способ воспроизвести это, вероятно, - заблокировать разрешения, щелкнув значок камеры справа в адресной строке.

person Philipp Hancke    schedule 12.10.2017
comment
Спасибо за помощь, Филип. Вы это имели в виду? this.captureUserMedia((stream, error) => { if (error) { console.log('error capturing user media'); return } ... - person Phil; 12.10.2017
comment
У меня все еще появляется ошибка MediaRecorder (хотя она обнаружена - забыл указать это). Я думаю, что упомянутый вами случай является дополнительной ошибкой, но не ошибкой, связанной с тем, что MediaRecorder не запускается из-за отсутствия аудио- или видеодорожек. Что ты думаешь? - person Phil; 12.10.2017