Echo and noise in sound webRTC android

2019-01-28 02:14发布

问题:

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 echo in sound. If i use hands-free on one end it gets better but i don't want to use hands-free.

So how can i improve the sound quality, what techniques are there to improve the sound quality. It also said the webRTC has echo cancellation functionality built in if it's than why echo is still there.

回答1:

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

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

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



回答2:

I guess you are experiencing the Larsen effect, the 2 audio output 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.



回答3:

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);