Echo and noise in sound webRTC android

前端 未结 3 1162
天命终不由人
天命终不由人 2020-12-20 16:48

I am working on webRTC i am doing live stream between two android devices on local network it is working pretty fine for me except the sound quality issue there is noise and

相关标签:
3条回答
  • 2020-12-20 17:21

    What's happening is that you are playing your own local audio back to yourself. This creates a feedback loop between your microphone and speakers. That's why it kinda sounds better when you have the hands-free device. You can remove the local audio by modifying the stream of getUserMedia():

    var constraints = {video: true, audio: true};
    getUserMedia(constraints, function(stream){
        var videoOnly = new MediaStream(stream.getVideoTracks());
    }, errorHandler);
    
    0 讨论(0)
  • 2020-12-20 17:23

    You can try to add special audio constraints when you are creating audio source. It should looks like:

    MediaConstraints audioConstraints = new MediaConstraints();
    audioConstarints.mandatory.add(new MediaConstraints.KeyValuePair("googNoiseSuppression", "true"));
    audioConstarints.mandatory.add(new MediaConstraints.KeyValuePair("googEchoCancellation", "true"));
    

    There are a lot of media constraints related to audio features and I suggest to try different combinations of them, full list can be found here https://chromium.googlesource.com/external/webrtc/+/master/talk/app/webrtc/mediaconstraintsinterface.cc

    0 讨论(0)
  • 2020-12-20 17:24

    I guess you are experiencing the Larsen effect, the 2 audio outputs being replayed by both microphones, creating endless audio loops. There is not much you can do against this if both devices are in the same room, but indeed browsers have echo cancellation options you can activate this way (not sure they are by default):

    if (window.chrome) {
        audioConstraints = {
            mandatory: {
                echoCancellation: true
            }
        }
    } else {
        audioConstraints = {
            echoCancellation: true
        }
    }
    var constraints = {video: videoConstraints, audio: audioConstraints};
    navigator.getUserMedia(constraints, userMediaSuccess, userMediaError);
    

    Also, mute the local video, users obviously don't need it.

    0 讨论(0)
提交回复
热议问题