【发布时间】: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 示例:
如果有人知道我可能做错了什么,我会很高兴听到它!
【问题讨论】: