Я реализую 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
Если кто-нибудь знает, что я делаю неправильно, я был бы счастлив услышать это!