Exemplo n.º 1
0
        private async Task PlayLiveVideo()
        {
            var allGroups = await MediaFrameSourceGroup.FindAllAsync();

            var eligibleGroups = allGroups.Select(g => new
            {
                Group = g,

                // For each source kind, find the source which offers that kind of media frame,
                // or null if there is no such source.
                SourceInfos = new MediaFrameSourceInfo[]
                {
                    g.SourceInfos.FirstOrDefault(info => info.DeviceInformation?.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front &&
                                                 info.SourceKind == MediaFrameSourceKind.Color),
                    g.SourceInfos.FirstOrDefault(info => info.DeviceInformation?.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back &&
                                                 info.SourceKind == MediaFrameSourceKind.Color)
                }
            }).Where(g => g.SourceInfos.Any(info => info != null)).ToList();

            if (eligibleGroups.Count == 0)
            {
                System.Diagnostics.Debug.WriteLine("No source group with front and back-facing camera found.");
                return;
            }

            var selectedGroupIndex = 0; // Select the first eligible group
            MediaFrameSourceGroup selectedGroup   = eligibleGroups[selectedGroupIndex].Group;
            MediaFrameSourceInfo  frontSourceInfo = selectedGroup.SourceInfos[0];

            MediaCapture mediaCapture = new MediaCapture();
            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings()
            {
                SourceGroup          = selectedGroup,
                SharingMode          = MediaCaptureSharingMode.ExclusiveControl,
                MemoryPreference     = MediaCaptureMemoryPreference.Cpu,
                StreamingCaptureMode = StreamingCaptureMode.Video,
            };

            try
            {
                await mediaCapture.InitializeAsync(settings);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("MediaCapture initialization failed: " + ex.Message);
                return;
            }
            var frameMediaSource1 = MediaSource.CreateFromMediaFrameSource(mediaCapture.FrameSources[frontSourceInfo.Id]);

            VideoStreamer.SetPlaybackSource(frameMediaSource1);
            VideoStreamer.Play();
        }
        private void SetupVideoStream(VideoStreamSettings settings)
        {
            logger.Debug("SetupVideoStream(...)");

            try
            {
                videoStreamer = new VideoStreamer(videoSource);

                videoStreamer.Setup(settings.EncodingParams, settings.NetworkParams);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                if (videoStreamer != null)
                {
                    videoStreamer.Close();
                    videoStreamer = null;
                }

                throw;
            }
        }
Exemplo n.º 3
0
        private void StartStreaming()
        {
            logger.Debug("ScreenStreamer::StartStreaming()");

            var videoSettings = Session.VideoSettings;

            if (videoSettings.Enabled)
            {
                var captureDevice = (VideoCaptureDevice)videoSettings.CaptureDevice.Clone();
                if (captureDevice.CaptureMode == CaptureMode.Screen)
                {
                    var screenDevice = (ScreenCaptureDevice)captureDevice;

                    if (screenDevice.CaptureRegion.Width > Config.MaxVideoEncoderWidth)
                    {
                        screenDevice.CaptureRegion.Width = Config.MaxVideoEncoderWidth;
                    }

                    if (screenDevice.CaptureRegion.Height > Config.MaxVideoEncoderHeight)
                    {
                        screenDevice.CaptureRegion.Height = Config.MaxVideoEncoderHeight;
                    }

                    screenDevice.Resolution = MediaToolkit.Utils.GraphicTools.DecreaseToEven(screenDevice.CaptureRegion.Size);
                }

                var videoEncoderSettings = (VideoEncoderSettings)videoSettings.EncoderSettings.Clone();
                if (videoSettings.UseEncoderResoulutionFromSource)
                {
                    videoEncoderSettings.Width  = captureDevice.Resolution.Width;
                    videoEncoderSettings.Height = captureDevice.Resolution.Height;
                }
                else
                {
                    captureDevice.Resolution = videoEncoderSettings.Resolution;
                }


                if (captureDevice.CaptureMode == CaptureMode.UvcDevice)
                {
                    videoSource = new VideoCaptureSource();
                }
                else if (captureDevice.CaptureMode == CaptureMode.Screen)
                {
                    videoSource = new ScreenSource();
                }

                videoSource.Setup(captureDevice);
                videoSource.CaptureStarted += VideoSource_CaptureStarted;
                videoSource.CaptureStopped += VideoSource_CaptureStopped;

                if (Session.TransportMode == TransportMode.Tcp || Session.IsMulticast)
                {
                    videoStreamer = new VideoStreamer(videoSource);
                    videoStreamer.Setup(videoEncoderSettings, videoSettings.NetworkSettings);

                    //videoStreamer.Setup(videoSettings.EncoderSettings, videoSettings.NetworkSettings);
                }
                else
                {
                    // currently not supported...
                }
            }

            var audioSettings = Session.AudioSettings;

            if (audioSettings.Enabled)
            {
                audioSource = new AudioSource();
                var captureDevice = audioSettings.CaptureDevice;

                var deviceId     = captureDevice.DeviceId;
                var captureProps = captureDevice.Properties;

                audioSource.Setup(deviceId, captureProps);

                if (Session.TransportMode == TransportMode.Tcp || Session.IsMulticast)
                {
                    audioStreamer = new AudioStreamer(audioSource);
                    audioStreamer.Setup(audioSettings.EncoderSettings, audioSettings.NetworkSettings);
                    audioStreamer.StateChanged += AudioStreamer_StateChanged;
                }
                else
                {
                    // currently not supported...
                }
            }

            communicationService = new CommunicationService(this);
            communicationService.Open();

            if (videoSettings.Enabled)
            {
                videoSource.Start();
                videoStreamer.Start();
            }

            if (audioSettings.Enabled)
            {
                audioSource.Start();
                audioStreamer.Start();
            }
        }