Search code examples
javascriptwebrtcgetusermedia

How to return stream object from getUserMedia


I want to access streamObject outside the getUserMedia. Here are the codes. Normally you would run script functions inside success callback but I don't to do that because the function getUserMedia is used many times and I don't want to repeat coding same function.

 var streamObject;
  requestDevices = {
     media:function(){
         navigator.getUserMedia(
             {video:true, audio:true},
             function(stream){
                 streamObject = stream; 
                 return streamObject //not working
            });
      }
  };

 /
stream  = {
   // I need the streamObject here
   startStream:function(stream){
         pc.addStream(streamObject);
       //blah blah blah
   }
}

I also tried code below, but did not work because the myCallback needs stream in the first place..

media:function(myCallback){
         navigator.getUserMedia(
             {video:true, audio:true},
             function(stream){
                 streamObject = stream; 
                 return streamObject;
                stream.startStream(streamObject);

            });
      }

Solution

  • You can/must use Promise, for example:

    var requestDevices = {
       media:function() {
         return new Promise(function(resolve, reject) {
           navigator.getUserMedia({ video: true, audio: true }, resolve, reject);
         });
       }
    };
    
    var stream = requestDevices.media();
    

    Wherever you need the stream object:

    stream.then(function(s) {
      Stream.startStream(s);
    });
    
    // Somewhere else
    stream.then(function(s) {
      ...
    });
    

    As @jib said, newer syntax for getUserMedia supports Promise natively, so you can just:

    var stream = navigator.mediaDevices.getUserMedia({ ... })
    

    For now you will also need the adapter.js polyfill.