ОБНОВЛЕНИЕ: текущая лучшая гипотеза состоит в том, что это каким-то образом вызвано большими сетями школ / университетов - другие пользователи не имеют проблемы.
Я использую 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()
Есть еще несколько деталей, которые могут помочь в решении этой проблемы:
- Chrome version does not seem to be the problem: some users with
v61.0.3163.100
have the problem, while others don't
- For the users who experience the problem, it seems to occur every time.
- Очевидно,
navigator.getUserMedia
устарел, но он все равно должен работать - сложная логика обещания может привести к ошибке.
ОБНОВИТЬ:
- Проблема произошла с двумя пользователями, которые были в больших сетях (сеть университета и сеть школьного округа). Этого еще не произошло ни с одним пользователем, который был в частных домашних сетях ....
Сообщите мне, какая еще информация будет полезна, и я немедленно отвечу. Спасибо.
ОБНОВИТЬ:
Муаз Хан предложил добавить скрытый аудиоэлемент, чтобы предотвратить остановку / выпуск потока и треков. Вот дополнительный код, который был добавлен перед захватом потока (при первой инициализации рекордера):
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:
Но все равно не работает. Мысль о том, почему это могло не сработать:
- Я не уверен, что 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
}
});
};
Еще раз спасибо.
ОБНОВИТЬ:
Включая сюда профили двух пользователей, у которых возникла эта проблема (оба из крупных сетей государственных школ / университетов). Проблема не возникает с пользователями частных домашних сетей: