Example #1
0
        public HttpResponseMessage StartRecording([FromUri] VideoStartRequest startRequest)
        {
            if (startRequest == null || string.IsNullOrEmpty(startRequest.Source))
            {
                return
                    (GenerateJsonResponse(
                         new
                {
                    Started = false,
                    StartRequest = startRequest,
                    Error = "No source was specified. A source is required."
                }));
            }

            if (startRequest.MaxDurationSecs == 0)
            {
                startRequest.MaxDurationSecs = (5 * 60);
            }

            var existingKeys =
                FfmpegInstance.RunningInstances.Where(i => i.StartRequest.RecordingKey == startRequest.RecordingKey);

            foreach (var existingInstance in existingKeys)
            {
                existingInstance.Stop(null);
            }

            FfmpegInstance newInstance = new FfmpegInstance();

            newInstance.Start(startRequest);
            Console.WriteLine("Starting recording: " + Newtonsoft.Json.JsonConvert.SerializeObject(startRequest));

            return(GenerateJsonResponse(new { Started = true, StartRequest = startRequest }));
        }
Example #2
0
        public void Start(VideoStartRequest startRequest)
        {
            StartRequest = startRequest;
            _encoder     = new FfMpegEncoder();
            _runningInstances.Add(this);
            string outFilePath = Path.Combine(new Video.VideoStorageProvider().VideoRootFolder.FullName,
                                              Guid.NewGuid().ToString().Replace("-", "") + ".mp4");

            RecordingPath = outFilePath;
            string inputArgs  = $"-i {startRequest.Source}";
            string outputArgs = $"-f mp4 -vcodec mpeg4 -r 30 -t {startRequest.MaxDurationSecs} {outFilePath}";

            if (startRequest.UseTcpRtsp)
            {
                inputArgs = $"-rtsp_transport tcp {inputArgs}";
            }

            string encodeArgs = $"{inputArgs} {outputArgs}";

            System.Threading.ThreadPool.QueueUserWorkItem((obj) =>
            {
                try
                {
                    _encoder.Encode(_ffMpegPath, encodeArgs);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error encoding from start request " +
                                      Newtonsoft.Json.JsonConvert.SerializeObject(StartRequest) + ": " + ex.Message);
                }
            });

            Stopwatch swFileCreate = new Stopwatch();

            swFileCreate.Start();
            while (swFileCreate.ElapsedMilliseconds < 10000)
            {
                if (System.IO.File.Exists(RecordingPath))
                {
                    break;
                }
                System.Threading.Thread.Sleep(500);
            }

            if (!System.IO.File.Exists(RecordingPath))
            {
                Console.WriteLine("Warning: Recording file not created after 10 seconds for request " +
                                  Newtonsoft.Json.JsonConvert.SerializeObject(StartRequest));
            }
        }