C#使用ffmpeg分割视频文件

1 篇文章 0 订阅
1 篇文章 0 订阅

使用ffmpeg分割视频文件

环境:ffmpeg&.NET4.0
效果如下:

在这里插入图片描述
在这里插入图片描述
代码如下:

**

    **using System;
    using System.Diagnostics;
    using System.IO;
    using static System.Console;
    namespace VideoSpilt
    {
        class DivideVideoIntoPart
        {
            private static int Threads; //线程数
            private static string InputFile;//要切割的视频文件
            private static string OutputRuler;//输出文件名
            private static int TotalTime;//文件总时长(单位s)
            private static int SpiltTime;//?时间切割一次(单位s)
            private static bool IsFailed = false; //失败标识
            private static object obj = new object();//线程锁
            private static int SpiltedTime = 0;//已切割时间
            private static int SpiltedFileCount = 0;//已切割文件数量
            public DivideVideoIntoPart()
            {
            }
            static void Main(string[] Args)
            {
                Title = "分割媒体文件";
                while (true)
                {
                    while (true)
                    {
                        try
                        {
                            while (true) {
                                try
                                {
                                    ExWrite("调用线程数(默认填1):");
                                    Threads = int.Parse(ReadLine());
                                    break;
                                }
                                catch { ExWriteLine("线程数值解析失败,请重新输入", ConsoleColor.Red); }
                            }
                            while (true)
                            {
                                try
                                {
                                    ExWrite("要分割的视频文件(全名,带路径):");
                                    InputFile = ReadLine();
                                    if (!File.Exists(InputFile)) { ExWriteLine("文件不存在,请重新输入", ConsoleColor.Red);}
                                    else { break; }
                                }
                                catch { ExWriteLine("文件位置解析失败,请重新输入",ConsoleColor.Red); }
                            }
                            ExWrite("输出文件的文件名(全名,带路径):");
                            OutputRuler = ReadLine();
                            while (true)
                            {
                                try
                                {
                                    ExWrite("视频总时长(单位:s):");
                                    TotalTime = Convert.ToInt32(ReadLine());
                                    break;
                                }
                                catch
                                {
                                    ExWriteLine("线程数值解析失败,请重新输入", ConsoleColor.Red);
                                }  
                            }
                            while(true)
                            {
                                try
                                {
                                    ExWrite("每次截取时长:");
                                    SpiltTime = Convert.ToInt32(ReadLine());
                                    if (SpiltTime > TotalTime) { ExWriteLine("每次切割的时长不能大于总时长",ConsoleColor.Red); continue; }
                                    else { break; }
                                }
                                catch
                                {
                                    ExWriteLine("时长解析失败,请重新输入",ConsoleColor.Red);
                                }
                            }
                            ExWriteLine("waitForProcess...",ConsoleColor.Yellow);
                            while (SpiltedTime < TotalTime)//开始切割
                            {
                                BeginSpilt();
                                SpiltedTime += SpiltTime;
                                SpiltedFileCount += 1;
                            }
                            if (SpiltedTime != TotalTime)
                            { //最后,当总时间÷已切割时间结果有余数时 则最后一段切割的时间是余数
                                SpiltTime = TotalTime - SpiltedTime;
                                BeginSpilt();
                            }
                            for (int i = 0; i < SpiltedFileCount; i++) //判断文件是否全部切割成功 若未成功则删除已分割的部分
                            {
                                if (File.Exists(OutputRuler.Substring(0, OutputRuler.LastIndexOf(".")) + $"-part{i}" + OutputRuler.Substring(OutputRuler.LastIndexOf(".")))&&new FileInfo(OutputRuler.Substring(0, OutputRuler.LastIndexOf(".")) + $"-part{i}" + OutputRuler.Substring(OutputRuler.LastIndexOf("."))).Length > 0) {
                                    ExWriteLine($"Task {i} 从{InputFile}中截取成功", ConsoleColor.Blue);
                                }
                                else { ExWriteLine($"Task {i} 从{InputFile}中截取失败", ConsoleColor.Red); ExWriteLine("尽量保证文件路径不含中文,成功率会提高", ConsoleColor.Red); DelFile(); break; }
                            }
                            if(!IsFailed)
                            {
                                ExWriteLine($"已将 {InputFile} 分割为{SpiltedFileCount}份",ConsoleColor.Green);
                            }
                            break;
                        }
                        catch(Exception ex) { ExWriteLine(ex.Message,ConsoleColor.Red); break; }
                    }
                    IsFailed = false;
                    SpiltedFileCount = 0;
                    SpiltedTime = 0;
                }
            }
            private static void DelFile()//删除已分割的视频文件
            {
                IsFailed = true;
                for (int i = 0; i < SpiltedFileCount; i++)
                {
                    try { File.Delete($"{OutputRuler.Substring(0, OutputRuler.LastIndexOf("."))}-part{i}{OutputRuler.Substring(OutputRuler.LastIndexOf("."))}"); } catch { continue; }
                }
            }
            static Process p; //Process组件
            private static void BeginSpilt()//开始切割
            {
                p = new Process();
                p.StartInfo.FileName = "ffmpeg.exe";
                p.StartInfo.Arguments = $"-threads {Threads} -ss {SpiltedTime.ToString()} -i \"{InputFile}\" -c copy -t {SpiltTime} \"{OutputRuler.Substring(0, OutputRuler.LastIndexOf("."))}-part{SpiltedFileCount}{OutputRuler.Substring(OutputRuler.LastIndexOf("."))}\" ".Trim();
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.OutputDataReceived += Output;
                p.ErrorDataReceived += Output;
                p.Start();
                p.Exited += P_Exited;
                p.StandardInput.AutoFlush = true;
                p.BeginOutputReadLine();
                p.BeginErrorReadLine();
                p.WaitForExit();
            }
            private static void P_Exited(object sender, EventArgs e)
            {
                ExWriteLine($"Task {SpiltedFileCount} is Completed",ConsoleColor.Yellow);
            }
            protected static void Output(object sender, DataReceivedEventArgs e)
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    ExWriteLine(e.Data);
                }
            }
            private static void ExWriteLine(string str,ConsoleColor cs = ConsoleColor.White)
            {
                lock(obj)
                {
                    ForegroundColor = cs;
                    Console.WriteLine(str);
                    ResetColor();
                }
            }
            private static void ExWrite(string str, ConsoleColor cs = ConsoleColor.White)
            {
                lock (obj)
                {
                    ForegroundColor = cs;
                    Console.Write(str);
                    ResetColor();
                }
            }
        }
    }**

**

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用FFmpeg分割视频文件可以通过编写脚本完成。以下是一些基本步骤: 1. 安装FFmpeg 首先需要安装FFmpeg。可以从FFmpeg的官方网站 https://www.ffmpeg.org/ 下载适合自己系统的安装包进行安装。 2. 编写脚本 在安装好FFmpeg之后,可以开始编写脚本。下面是一个示例脚本,用于将一个视频文件分割成多个小的视频文件。 ``` #!/bin/bash # 定义变量 INPUT_VIDEO="input.mp4" OUTPUT_DIR="output" START_TIME="00:00:00" DURATION="00:05:00" FILE_NAME_PREFIX="video_" # 创建输出目录 mkdir -p $OUTPUT_DIR # 分割视频文件 ffmpeg -i $INPUT_VIDEO -ss $START_TIME -t $DURATION -c copy -map 0 $OUTPUT_DIR/$FILE_NAME_PREFIX%03d.mp4 ``` 在这个脚本中,需要定义一些变量。其中,`INPUT_VIDEO`是需要分割视频文件名;`OUTPUT_DIR`是分割视频文件保存的目录;`START_TIME`是分割视频的起始时间;`DURATION`是每个小视频文件的时长;`FILE_NAME_PREFIX`是每个小视频文件名的前缀。 然后,通过`mkdir`命令创建输出目录,最后使用FFmpeg命令进行视频文件分割。其中,`-ss`参数表示从指定的时间点开始分割视频,`-t`参数表示每个小视频文件的时长,`-c copy`表示复制原视频文件的编码方式,`-map 0`表示保留原视频文件的所有流。 3. 运行脚本 在编写好脚本之后,可以通过命令行运行脚本。首先需要将脚本保存为一个文件,比如`split_video.sh`。然后,通过以下命令运行脚本: ``` bash split_video.sh ``` 运行脚本后,就可以看到视频文件分割成了多个小的视频文件,并保存在指定的输出目录中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值