Loading src/VideoSlice.Cli/MainCommand.cs +69 −2 Original line number Diff line number Diff line using System.ComponentModel; using shRabbit.Base.IO.Directories; using shRabbit.Base.IO.Files; using Spectre.Console; using Spectre.Console.Cli; namespace VideoSlice.Cli; Loading @@ -14,11 +17,75 @@ public class MainCommand : AsyncCommand<MainCommand.Settings> [CommandOption("-d|--dir")] [Description("选择的视频目录。")] public string? Directory { get; set; } public string Directory { get; set; } = string.Empty; [CommandOption("-f|--ffmpeg")] [CommandOption("-s|--desc")] [Description("图像文件输出目录。")] public string Desc { get; set; } = "output"; [CommandOption("-fm|--format")] [Description("图像格式(默认png)。")] public string Format { get; set; } = "png"; [CommandOption("-fm|--format")] [Description("视频格式(默认mp4,可用','使用多个)。")] public string VideoFormats { get; set; } = "mp4"; [CommandOption("-p|-parallel")] [Description("并行处理数量。")] public uint ParallelNumber { get; set; } = 4; [CommandOption("-m|--ffmpeg")] [Description("FFmpeg命令行程序的路径。")] public string FfMpegPath { get; set; } = "ffmpeg"; [CommandOption("-s|--slice")] [Description("将视频按照时长切分的间隔时间(默认30m)。")] public string SliceTime { get; set; } = "30m"; } /// <summary> /// 生成 ffmpeg 调用参数。 /// </summary> /// <param name="settings"></param> /// <param name="file"></param> /// <param name="dir"></param> /// <returns>两层数组,第一次是每个命令,第二次是命令中的参数。</returns> public static string[][] GenerateFfMpegCommand(Settings settings, IFile file, IDirectory dir) { var files = GetFiles(settings, dir); var arr = new string[files.Length][]; var time = SimpleTimeSpanExpress.ToTimeSpan(settings.SliceTime); for (var i = 0; i < arr.Length; i++) { arr[i] = ["-i", files[i], "-vf", $"\"fps:1/{time.TotalSeconds}\"", $"{settings.Desc}{files[i]}_%03d.{settings.Format}"]; } return arr; } public static string[] GetFiles(Settings settings, IDirectory dir) { if (settings.File is { } s) return [s]; var split = settings.VideoFormats.Split(','); var list = new List<string>(); foreach (var f in dir.EnumerateFiles(settings.Directory)) { foreach (var sp in split) { if (Path.GetExtension(f).TrimStart('.') == sp.TrimStart('.')) { AnsiConsole.WriteLine($"找到: {f}"); list.Add(f); } } } return list.ToArray(); } protected override async Task<int> ExecuteAsync(CommandContext context, Settings settings, CancellationToken cancellationToken) Loading Loading
src/VideoSlice.Cli/MainCommand.cs +69 −2 Original line number Diff line number Diff line using System.ComponentModel; using shRabbit.Base.IO.Directories; using shRabbit.Base.IO.Files; using Spectre.Console; using Spectre.Console.Cli; namespace VideoSlice.Cli; Loading @@ -14,11 +17,75 @@ public class MainCommand : AsyncCommand<MainCommand.Settings> [CommandOption("-d|--dir")] [Description("选择的视频目录。")] public string? Directory { get; set; } public string Directory { get; set; } = string.Empty; [CommandOption("-f|--ffmpeg")] [CommandOption("-s|--desc")] [Description("图像文件输出目录。")] public string Desc { get; set; } = "output"; [CommandOption("-fm|--format")] [Description("图像格式(默认png)。")] public string Format { get; set; } = "png"; [CommandOption("-fm|--format")] [Description("视频格式(默认mp4,可用','使用多个)。")] public string VideoFormats { get; set; } = "mp4"; [CommandOption("-p|-parallel")] [Description("并行处理数量。")] public uint ParallelNumber { get; set; } = 4; [CommandOption("-m|--ffmpeg")] [Description("FFmpeg命令行程序的路径。")] public string FfMpegPath { get; set; } = "ffmpeg"; [CommandOption("-s|--slice")] [Description("将视频按照时长切分的间隔时间(默认30m)。")] public string SliceTime { get; set; } = "30m"; } /// <summary> /// 生成 ffmpeg 调用参数。 /// </summary> /// <param name="settings"></param> /// <param name="file"></param> /// <param name="dir"></param> /// <returns>两层数组,第一次是每个命令,第二次是命令中的参数。</returns> public static string[][] GenerateFfMpegCommand(Settings settings, IFile file, IDirectory dir) { var files = GetFiles(settings, dir); var arr = new string[files.Length][]; var time = SimpleTimeSpanExpress.ToTimeSpan(settings.SliceTime); for (var i = 0; i < arr.Length; i++) { arr[i] = ["-i", files[i], "-vf", $"\"fps:1/{time.TotalSeconds}\"", $"{settings.Desc}{files[i]}_%03d.{settings.Format}"]; } return arr; } public static string[] GetFiles(Settings settings, IDirectory dir) { if (settings.File is { } s) return [s]; var split = settings.VideoFormats.Split(','); var list = new List<string>(); foreach (var f in dir.EnumerateFiles(settings.Directory)) { foreach (var sp in split) { if (Path.GetExtension(f).TrimStart('.') == sp.TrimStart('.')) { AnsiConsole.WriteLine($"找到: {f}"); list.Add(f); } } } return list.ToArray(); } protected override async Task<int> ExecuteAsync(CommandContext context, Settings settings, CancellationToken cancellationToken) Loading