Webrt c MediaStreamTrack.CreateVideoTrack возвращает трек с завершенным состоянием - PullRequest
0 голосов
/ 07 мая 2020

Я реализую webrt c с использованием sdk из этого репо:

https://github.com/webrtc-uwp/webrtc-uwp-sdk

Моя реализация в большинстве случаев работает хорошо, но у меня есть проблемы при создании и прекращении посылки вызовов в быстрой последовательности. Иногда при вызове MediaStreamTrack.CreateVideoTrack я получаю дорожку с завершенным состоянием, что, как я понимаю, означает, что я не получу мультимедиа с этой дорожки. При прекращении разговора я удаляю предыдущее одноранговое соединение, а также удаляю треки. Я подозреваю, что, возможно, камера отключается в фоновом режиме после того, как я избавился от всех своих ресурсов, однако я нахожу это немного странным.

Код, создающий видеодорожку, выглядит так:

var factoryConfig = new WebRtcFactoryConfiguration();
                    factoryConfig.AudioCaptureDeviceId = MediaDevice.GetDefaultAudioCaptureId(AudioDeviceRole.Default);
                    factoryConfig.AudioRenderDeviceId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);

                    var _factory = new WebRtcFactory(factoryConfig);
var cameraDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
                    var frontFacing = cameraDevices.FirstOrDefault(c => c.EnclosureLocation.Panel == Panel.Front);
                    var videoParams = new VideoCapturerCreationParameters()
                    {
                        Name = frontFacing.Name,
                        Id = frontFacing.Id,
                        EnableMrc = false
                    };
                    var mandatoryConstraints = new List<Constraint>() {
                        new Constraint("maxWidth", "1280"),
                        new Constraint("minWidth", "1280"),
                        new Constraint("maxHeight", "720"),
                        new Constraint("minHeight", "720"),
                        new Constraint("maxFrameRate", "30"),
                        new Constraint("minFrameRate", "15")
                    };
                    IReadOnlyList<Constraint> optionalConstraints = new List<Constraint>();
                    var videoCapturer = VideoCapturer.Create(videoParams);
                    var options = new VideoOptions();
                    options.Factory = _factory;
                    options.Capturer = videoCapturer;
                    options.Constraints = new MediaConstraints { Mandatory = mandatoryConstraints, Optional = optionalConstraints };
                    _videoTrackSource = VideoTrackSource.Create(options);
                    _selfVideoTrack = MediaStreamTrack.CreateVideoTrack("SELF_VIDEO", _videoTrackSource);

Код, который я использую для завершения вызова, выглядит следующим образом:

                if (_peerConnection == null)
                {
                    return;
                }

                _peerConnection.OnIceGatheringStateChange -= PeerConnection_OnIceGatheringStateChange;
                _peerConnection.OnIceCandidate -= PeerConnection_OnIceCandidate;
                _peerConnection.OnTrack -= PeerConnection_OnTrack;
                _peerConnection.OnRemoveTrack -= PeerConnection_OnRemoveTrack;
                _peerConnection.OnIceConnectionStateChange -= PeerConnection_OnIceConnectionStateChange;
                _peerConnection.OnNegotiationNeeded -= PeerConnection_OnNegotiationNeeded;

                if (_remoteVideoTrack != null)
                    _remoteVideoTrack.Element = null;
                if (_selfVideoTrack != null)
                    _selfVideoTrack.Element = null;

                (_selfVideoTrack as IDisposable)?.Dispose();
                (_selfAudioTrack as IDisposable)?.Dispose();
                (_remoteVideoTrack as IDisposable)?.Dispose();
                (_remoteAudioTrack as IDisposable)?.Dispose();

                _selfVideoTrack = null;
                _selfAudioTrack = null;
                _remoteVideoTrack = null;
                _remoteAudioTrack = null;

                (_peerConnection as IDisposable)?.Dispose();
                _peerConnection = null;

                GC.Collect();   //Not pretty but it seems neccessary at this point to close camera

Я основал большую часть своего кода на образце Peer CC в репозитории, упомянутом в начале сообщения :

https://github.com/webrtc-uwp/PeerCC/blob/9bcdc04a9d0d8f8b66e313272312ebb608154aa0/ClientCore/Signalling/Conductor.cs

Если кто-нибудь знает, что я делаю неправильно, я был бы счастлив услышать это!

...