private void doThing(string deviceId, string vhostDomain, Ingest ingest) { LogWriter.WriteLog("重启设备ID" + deviceId + "下的" + vhostDomain + "下的" + ingest.IngestName + " Ingest"); lock (SrsManageCommon.Common.LockDbObjForOnlineClient) { OrmService.Db.Delete <OnlineClient>().Where(x => x.RtspUrl == ingest.Input !.Url).ExecuteAffrows(); } var retInt = foundProcess(ingest); if (retInt > -1) { try { string cmd = "kill -9 " + retInt.ToString(); LinuxShell.Run(cmd, 1000); } catch (Exception ex) { LogWriter.WriteLog( "重启设备ID" + deviceId + "下的" + vhostDomain + "下的" + ingest.IngestName + " Ingest失败", ex.Message + "\r\n" + ex.StackTrace, ConsoleColor.Yellow); } } ResponseStruct rs = null !; VhostIngestApis.OnOrOffIngest(deviceId, vhostDomain, ingest.IngestName !, false, out rs); SystemApis.RefreshSrsObject(deviceId, out rs); Thread.Sleep(1000); VhostIngestApis.OnOrOffIngest(deviceId, vhostDomain, ingest.IngestName !, true, out rs); SystemApis.RefreshSrsObject(deviceId, out rs); }
/// <summary> /// 将mp4转为ts格式封装,这里可能需要捕获异常,超时30分钟 /// </summary> /// <param name="task"></param> /// <returns></returns> private static CutMergeTask packageToTsStreamFile(CutMergeTask task) { task.TaskStatus = TaskStatus.Packaging; string tsPath = Common.WorkPath + "CutMergeDir/" + task.TaskId + "/ts"; if (!Directory.Exists(tsPath)) { Directory.CreateDirectory(tsPath); } for (int i = 0; i <= task.CutMergeFileList !.Count - 1; i++) { string videoFileNameWithOutExt = Path.GetFileNameWithoutExtension(task.CutMergeFileList[i] !.FilePath !); string videoTsFileName = videoFileNameWithOutExt + ".ts"; string videoTsFilePath = tsPath + "/" + videoTsFileName; string ffmpegCmd = Common.FFmpegBinPath + " -i " + task.CutMergeFileList[i] !.FilePath !+ " -vcodec copy -acodec copy -vbsf h264_mp4toannexb " + videoTsFilePath + " -y"; var retRun = LinuxShell.Run(ffmpegCmd, 1000 * 60 * 30, out string std, out string err); if (retRun && (!string.IsNullOrEmpty(std) || !string.IsNullOrEmpty(err)) && File.Exists(videoTsFilePath)) { long find = -1; if (!string.IsNullOrEmpty(std)) { var str = Common.GetValue(std, "video:", "audio:"); if (!string.IsNullOrEmpty(str)) { str = str.ToLower(); str = str.Replace("kb", ""); long.TryParse(str, out find); } } else if (!string.IsNullOrEmpty(err)) { var str = Common.GetValue(err, "video:", "audio:"); str = str.ToLower(); str = str.Replace("kb", ""); long.TryParse(str, out find); } if (find > 0) { task.CutMergeFileList[i].FilePath = videoTsFilePath; LogWriter.WriteLog("合并请求转换TS任务成功(packageToTsStreamFile)...", task.TaskId !+"->" + videoTsFilePath); } else { LogWriter.WriteLog("合并请求转换TS任务失败(packageToTsStreamFile)...", task.TaskId !+"->" + videoTsFilePath + " ***\r\n" + err, ConsoleColor.Yellow); } } task.ProcessPercentage += ((double)1 / (double)task.CutMergeFileList !.Count * 100f) * 0.4f; Thread.Sleep(20); } return(task); }
/// <summary> /// 生成合并文件,并合并ts文件,同时输出mp4文件, -movflags faststart 标记是可让mp4在web上快速加载播放,超时30分钟 /// </summary> /// <param name="task"></param> /// <returns></returns> private static string mergeProcess(CutMergeTask task) { task.TaskStatus = TaskStatus.Mergeing; string mergePath = Common.WorkPath + "CutMergeDir/" + task.TaskId; string outPutPath = Common.WorkPath + "CutMergeFile/" + DateTime.Now.Date.ToString("yyyy-MM-dd"); if (!Directory.Exists(outPutPath)) { Directory.CreateDirectory(outPutPath); } List <string> mergeStringList = new List <string>(); for (int i = 0; i <= task.CutMergeFileList !.Count - 1; i++) { mergeStringList.Add("file '" + task.CutMergeFileList[i].FilePath + "'"); } File.WriteAllLines(mergePath + "files.txt", mergeStringList); string newFilePath = outPutPath + "/" + task.TaskId + "_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".mp4"; string ffmpegCmd = Common.FFmpegBinPath + " -threads " + Common.FFmpegThreadCount.ToString() + " -f concat -safe 0 -i " + mergePath + "files.txt" + " -c copy -movflags faststart " + newFilePath; var retRun = LinuxShell.Run(ffmpegCmd, 1000 * 60 * 30, out string std, out string err); task.ProcessPercentage += 40f; if (retRun && (!string.IsNullOrEmpty(std) || !string.IsNullOrEmpty(err)) && File.Exists(newFilePath)) { long find = -1; if (!string.IsNullOrEmpty(std)) { var str = Common.GetValue(std, "video:", "audio:"); if (!string.IsNullOrEmpty(str)) { str = str.ToLower(); str = str.Replace("kb", ""); long.TryParse(str, out find); } } else if (!string.IsNullOrEmpty(err)) { var str = Common.GetValue(err, "video:", "audio:"); str = str.ToLower(); str = str.Replace("kb", ""); long.TryParse(str, out find); } if (find > 0) { LogWriter.WriteLog("合并请求任务成功(mergeProcess)...", task.TaskId !+"->" + newFilePath); return(newFilePath); } } LogWriter.WriteLog("合并请求任务失败(mergeProcess失败)...", task.TaskId !+"\r\n" + err, ConsoleColor.Yellow); return(null !); }
private void processSrsFileMove(string srsFilePath) { string fileName = Path.GetFileName(srsFilePath); string dirPath = Path.GetDirectoryName(srsFilePath)!; if (!Directory.Exists(dirPath + "/logbak")) { Directory.CreateDirectory(dirPath + "/logbak"); } fileName = dirPath + "/logbak/srslogback_" + DateTime.Now.ToString("yyyy-MM-ddTHH-mm-ss") + fileName; File.Copy(srsFilePath, fileName); LinuxShell.Run("cat /dev/null >" + srsFilePath); LogWriter.WriteLog("转存srs日志,并清空现有日志", srsFilePath + "->" + fileName); }
/// <summary> /// 对需要裁剪的视频进行裁剪,超时30分钟 /// </summary> /// <param name="cms"></param> /// <returns></returns> private static CutMergeStruct cutProcess(CutMergeStruct cms) { string tsPath = Path.GetDirectoryName(cms.FilePath !) !; string fileName = Path.GetFileName(cms.FilePath !) !; string newTsName = tsPath + "/cut_" + fileName; string ffmpegCmd = Common.FFmpegBinPath + " -i " + cms.FilePath + " -vcodec copy -acodec copy -ss " + cms.CutStartPos + " -to " + cms.CutEndPos + " " + newTsName + " -y"; var retRun = LinuxShell.Run(ffmpegCmd, 1000 * 60 * 30, out string std, out string err); if (retRun && (!string.IsNullOrEmpty(std) || !string.IsNullOrEmpty(err)) && File.Exists(newTsName)) { long find = -1; if (!string.IsNullOrEmpty(std)) { var str = Common.GetValue(std, "video:", "audio:"); if (!string.IsNullOrEmpty(str)) { str = str.ToLower(); str = str.Replace("kb", ""); long.TryParse(str, out find); } } else if (!string.IsNullOrEmpty(err)) { var str = Common.GetValue(err, "video:", "audio:"); str = str.ToLower(); str = str.Replace("kb", ""); long.TryParse(str, out find); } if (find > 0) { LogWriter.WriteLog("合并请求任务裁剪成功(cutProcess)...", newTsName); cms.FilePath = newTsName; } else { LogWriter.WriteLog("合并请求任务裁剪失败(cutProcess)...", ffmpegCmd + "\r\n" + err, ConsoleColor.Yellow); } } return(cms); }
private int foundProcess(Ingest ingest) { string url = ingest.Input !.Url !.Replace("&", @"\&"); string cmd = "ps -aux |grep " + url + "|grep -v grep |awk '{print $2}'"; LinuxShell.Run(cmd, 1000, out string sdt, out string err); if (string.IsNullOrEmpty(sdt) && string.IsNullOrEmpty(err)) { return(-1); } if (int.TryParse(sdt, out int i)) { return(i); } if (int.TryParse(err, out int j)) { return(j); } return(-1); }