コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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 !);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        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);
        }