0

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:

  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. Apparently, navigator.getUserMedia is deprecated, but it still should function— the complicated logic of the promise could be introducing a bug.

UPDATE:

  1. 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:

  1. 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:

enter image description here enter image description here

Antwort

0

Das Problem war der captureUserMedia, den Zugriff auf den Stream benötigt:

captureUserMedia(callback) { 
var params = { audio: true, video: false }; 
navigator.getUserMedia(params, (stream) => { 
    callback(stream) 
}, (err) => { 
    callback(null, err) 
}) 
return 
} 
1

Dieser Code wird fehlschlagen, wenn ein getUserMedia Fehler. Ändern Sie zu this.captureUserMedia((stream, err) => { und handle Err gesetzt (während Stream ist null). Der einfachste Weg, dies zu reproduzieren, ist wahrscheinlich, die Berechtigungen zu blockieren, indem Sie auf das Kamerasymbol ganz rechts in der Adressleiste klicken.

+0

Danke für die Hilfe, Philip. Haben Sie daran gedacht? 'this.captureUserMedia ((Strom, Fehler) => {if (Fehler) {console.log ('Fehler Benutzermedien erfassen'); return}' ... – Phil

+0

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

Verwandte Themen