UPDATE: Die aktuelle beste Hypothese ist, dass dies irgendwie durch die großen Netzwerke von Schulen/Universitäten verursacht wird - andere Benutzer haben das Problem nicht.Warum startet MediaRecorder nicht? (Fehler: Es sind keine Audio- oder Videospuren verfügbar) RecordRTC
Ich verwende RecordRTC, um Audio aufzunehmen. Das beruht auf MediaRecorder.
Beim ersten Starten der Aufnahme, diese (gefangen) Fehler protokolliert:
DOM exception: failed to execute start on Media recorder: The
MediaRecorder failed to start because there are no audio or video
tracks available
Davor ruft RecordRTC die MediaRecorder API:
Using recorderType:MediaStreamRecorder
Passing following config over MediaRecorder API.Object {audio: "true", mimeType: "audio/webm", checkForInactiveTracks: "true", type: "audio", initCallback: "[object Function]"}
Und hier ist die Rückverfolgung im Code. Es beginnt mit einem Aufruf an startRecording
(in einer redux Saga):
const recorder = yield select(getRecorder)
yield call(recorder.startRecording)
Hier 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)
}
}
Hier 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)
});
};
Der Fehler bei dieser Linie auftreten scheint insbesondere von startRecording
:
this.rtcRecorder.startRecording()
Es gibt ein paar mehr Details, die diese bei der Lösung hilfreich sein könnten:
- 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.
- Apparently,
navigator.getUserMedia
is deprecated, but it still should function— the complicated logic of the promise could be introducing a bug.
UPDATE:
- The problem has happened to two users who were on large networks (A university network and a public school district network). It has not yet happened to any users who were on private home networks....
Lassen Sie mich wissen, was andere Informationen hilfreich sein würde, und ich werde sofort antworten. Vielen Dank.
UPDATE:
Muaz Khan ein verstecktes Audio-Element hinzugefügt wird vorgeschlagen, den Strom und Tracks von gestoppt/freigegeben zu verhindern. Hier ist der zusätzliche Code, der vor der Aufnahme eines Stroms hinzugefügt wurde (wenn der Recorder wird zunächst initialisiert):
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()
UPDATE 2:
Aber es ist immer noch nicht funktioniert. Ein Gedanke, warum das nicht funktioniert haben könnte:
- Ich bin nicht sicher, dass das HTML-Element HiddenAudio tatsächlich beibehalten und den Stream erfasst. (Es könnte falsch scoped werden.)
Ich frage mich nach links, wenn es ein subtiler Fehler in der Callback-Hölle von navigator.getUserMedia
und dass die neueren mit navigator.mediaDevices getusermedia
(die auf Versprechungen beruhen) wäre einfacher zu folgen.
Die andere Möglichkeit ist, dass der Fehler eingeführt wird, wenn der Recorder initialized- das ist hier:
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
}
});
};
Nochmals vielen Dank.
UPDATE:
hier Einschließlich der Profile von zwei Benutzer, die dieses Problem haben (beide großen öffentlichen Schule/Universität Netzwerke). Das Problem ist nicht der Fall für die Benutzer auf einem privaten Heimnetzwerk:
Danke für die Hilfe, Philip. Haben Sie daran gedacht? 'this.captureUserMedia ((Strom, Fehler) => {if (Fehler) {console.log ('Fehler Benutzermedien erfassen'); return}' ... – Phil
Ich bin immer noch der MediaRecorder Fehler bekommen (Ich denke, der Fall, den Sie erwähnen, ist ein zusätzlicher Fehler, aber nicht der Fehler, der damit zusammenhängt, dass der MediaRecorder nicht startet, weil keine Audio- oder Videospuren vorhanden sind Was sind Ihre Gedanken? – Phil