Сейчас я использую вот такую конструкцию чтобы иметь полный контроль:
private async getUserMedia(video:Object | boolean, audio:boolean): Promise<any> {
return await navigator.mediaDevices.getUserMedia({video, audio}).then(stream => {
this.mediaStream = stream;
return stream;
});
}
public async create(video:Object | boolean, audio:boolean): Promise<any> {
return this.getUserMedia(video, audio).catch(_ => {
return this.getUserMedia(video, false).catch(_ => {
this.mediaStream = undefined;
return this.getUserMedia(false, audio).catch(_ => {
this.mediaStream = new MediaStream();
});
});
});
}