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 })); }
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)); } }