/// <summary> /// Accesses the local video track, specified by /// this.selectedDevice and this.selectedProfile. /// MUST NOT BE CALLED FROM THE UI THREAD. /// </summary> /// <param name="factory"></param> /// <returns></returns> private IMediaStreamTrack getLocalVideo(IWebRtcFactory factory) { IReadOnlyList <IConstraint> mandatoryConstraints = new List <IConstraint>() { new Constraint("maxWidth", this.selectedProfile.Width.ToString()), new Constraint("minWidth", this.selectedProfile.Width.ToString()), new Constraint("maxHeight", this.selectedProfile.Height.ToString()), new Constraint("minHeight", this.selectedProfile.Height.ToString()), new Constraint("maxFrameRate", this.selectedProfile.FrameRate.ToString()), new Constraint("minFrameRate", this.selectedProfile.FrameRate.ToString()) }; IReadOnlyList <IConstraint> optionalConstraints = new List <IConstraint>(); var mediaConstraints = new MediaConstraints(mandatoryConstraints, optionalConstraints); // this will throw a very unhelpful exception if called from the UI thread var videoCapturer = VideoCapturer.Create(this.selectedDevice.Name, this.selectedDevice.Id, false); var options = new VideoOptions() { Factory = factory, Capturer = videoCapturer, Constraints = mediaConstraints }; var videoTrackSource = VideoTrackSource.Create(options); return(MediaStreamTrack.CreateVideoTrack("LocalVideo", videoTrackSource)); }
/// <summary> /// Accesses the local audio track as specified /// by the operating system. /// MUST NOT BE CALLED FROM THE UI THREAD. /// </summary> /// <param name="factory"></param> /// <returns></returns> private IMediaStreamTrack getLocalAudio(IWebRtcFactory factory) { var audioOptions = new AudioOptions() { Factory = factory }; // this will throw a very unhelpful exception if called from the UI thread var audioTrackSource = AudioTrackSource.Create(audioOptions); return(MediaStreamTrack.CreateAudioTrack("LocalAudio", audioTrackSource)); }