Esempio n. 1
0
        public void Close()
        {
            logger.Debug("VideoStreamer::Close()");
            if (running)
            {
                state = StreamerState.Closing;

                syncEvent.Set();
            }
            else
            {
                CleanUp();
            }
        }
Esempio n. 2
0
        private void CleanUp()
        {
            logger.Debug("VideoStreamer::CleanUp()");

            if (videoEncoder != null)
            {
                videoEncoder.DataEncoded -= VideoEncoder_DataEncoded;
                videoEncoder.Close();
                videoEncoder = null;
            }


            videoSource.BufferUpdated -= ScreenSource_BufferUpdated;

            RtpSender?.Close();

            state = StreamerState.Closed;
        }
Esempio n. 3
0
 private void AsyncProducer()
 {
     try
     {
         while (_state == StreamerState.Started)
         {
             Enqueue0(Acquire());
         }
     }
     catch (ThreadInterruptedException) { }
     catch (EndOfStreamException) { }
     finally
     {
         lock (_stateLock)
             if (_state == StreamerState.Stopping)
             {
                 _state = StreamerState.Stopped;
             }
     }
 }
Esempio n. 4
0
 public sealed override void Stop()
 {
     lock (_stateLock)
         if (_state == StreamerState.Started)
         {
             Stopping?.Invoke(this, EventArgs.Empty);
             if (_tProducer.IsAlive)
             {
                 _tProducer.Interrupt();
                 _state = StreamerState.Stopping;
             }
             else
             {
                 _state = StreamerState.Stopped;
             }
         }
         else
         {
             throw new Exception($"Illegal State: {_state}");
         }
 }
Esempio n. 5
0
 public sealed override void Start()
 {
     lock (_stateLock)
     {
         if (_state != StreamerState.Initialized)
         {
             throw new Exception($"Illegal State: {_state}");
         }
         _state = StreamerState.Started;
         _queued.Clear();
         _semaphore = new Semaphore(0, int.MaxValue);
         Started?.Invoke(this, EventArgs.Empty);
     }
     (_tProducer = new Thread(AsyncProducer)
     {
         IsBackground = true, Name = $"Stream '{StreamId}' Producer", Priority = ThreadPriority.AboveNormal
     }).Start();
     (_tConsumer = new Thread(AsyncConsumer)
     {
         IsBackground = true, Name = $"Stream '{StreamId}' Consumer", Priority = ThreadPriority.BelowNormal
     }).Start();
 }
Esempio n. 6
0
        public bool Start()
        {
            logger.Debug("ScreenStreamer::Start()");
            if (running)
            {
                return(false);
            }

            if (state != StreamerState.Initialized)
            {
                //...
                return(false);
            }

            state = StreamerState.Starting;

            Task.Run(() =>
            {
                DoStreaming();
            });

            return(true);
        }
Esempio n. 7
0
        public void Setup(VideoEncoderSettings encoderSettings, NetworkSettings networkSettings)
        {
            logger.Debug("ScreenStreamer::Setup()");

            this.Id = "VideoStreamer_" + Guid.NewGuid().ToString();

            this.EncoderSettings = encoderSettings;
            this.NetworkSettings = networkSettings;

            try
            {
                H264Session = new H264Session();
                if (networkSettings.TransportMode == TransportMode.Tcp)
                {
                    RtpSender = new RtpTcpSender(H264Session);
                }
                else if (networkSettings.TransportMode == TransportMode.Udp)
                {
                    RtpSender = new RtpUdpSender(H264Session);
                }
                else
                {
                    throw new FormatException("NotSupportedFormat " + networkSettings.TransportMode);
                }

                //rtpStreamer = new RtpStreamer(h264Session);
                RtpSender.Setup(networkSettings);

                networkSettings.SSRC = H264Session.SSRC;

                RtpSender.Start();

                //var hwContext = screenSource.hwContext;
                //var hwDevice = hwContext.device;

                //var srcSize = videoSource.SrcSize; //new Size(screenSource.Buffer.bitmap.Width, screenSource.Buffer.bitmap.Height);

                //if (encodingSettings.UseResoulutionFromSource)
                //{
                //    encodingSettings.Resolution = srcSize;
                //}

                //encoder = new FFmpegVideoEncoder();
                //encoder.Open(encodingParams);
                //encoder.DataEncoded += Encoder_DataEncoded;

                videoEncoder = new VideoEncoder(videoSource);
                videoEncoder.Open(encoderSettings);
                videoEncoder.DataEncoded += VideoEncoder_DataEncoded;

                videoSource.BufferUpdated += ScreenSource_BufferUpdated;

                state = StreamerState.Initialized;
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                CleanUp();

                throw;
            }
        }
Esempio n. 8
0
        private void DoStreaming()
        {
            running = true;

            logger.Info("Streaming thread started...");
            if (state != StreamerState.Starting)
            {
                //...
            }

            try
            {
                streamStats.Reset();

                // Statistic.RegisterCounter(streamStats);

                //var hwContext = screenSource.hwContext;
                //mfEncoder.Start();


                state = StreamerState.Streaming;
                StateChanged?.Invoke();

                while (state == StreamerState.Streaming)
                {
                    try
                    {
                        if (!syncEvent.WaitOne(1000))
                        {
                            continue;
                        }

                        if (state != StreamerState.Streaming)
                        {
                            break;
                        }

                        sw.Restart();

                        videoEncoder.Encode();
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex);
                        Thread.Sleep(1000);
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
            finally
            {
                CleanUp();

                //Statistic.UnregisterCounter(streamStats);

                running = false;

                state = StreamerState.Closed;
                StateChanged?.Invoke();
            }

            logger.Info("Streaming thread ended...");
        }