【问题标题】:Webrtc MediaStreamTrack.CreateVideoTrack return track with state endedWebrtc MediaStreamTrack.CreateVideoTrack 返回轨道,状态结束
【发布时间】:2020-05-07 14:26:40
【问题描述】:

我正在使用这个 repo 中的 sdk 实现 webrtc:

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

我的很多代码都基于文章开头提到的存储库中的 PeerCC 示例:

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

如果有人知道我可能做错了什么,我会很高兴听到它!

【问题讨论】:

    标签: c# video uwp webrtc


    【解决方案1】:

    我没有找到问题的原因。但是我设法通过简单地实现重试行为来解决它,这样如果我得到一个状态在创建时结束的轨道,我只需重试几次。这么久就成功了。如果第一次失败,通常会成功第二次或第三次。

    我知道这不是解决我的问题的最佳方法,但我认为如果它对处于相同情况的任何人有帮助,我应该添加它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多