C#操作ffmpeg(附源码)

C#中调用外部程序

  • 使用Process我们可以调用一些外部的exe程序
  • 有些时候,我们的C#功能有限,而且开发精力和时间也有限,我们可以调用一些第三方的exe文件,这些exe文件可以不是C#开发的。

补充说明

  • 结合前节代码,正是通过 System.Diagnostics.Process 调用了 ffmpeg.exe 这一第三方工具。
  • 需设置 UseShellExecute = false 以便重定向输出流,隐藏窗口可配合 CreateNoWindow = true

支持选择多个视频

  • 我们添加这样的功能,点击选择按钮的时候,允许我们选择多个视频。然后批量切片多个视频
  • 还有就是保存的目录如果为空则用当前目录,并且在当前目录下面创建一个叫m3u8的目录 然后在里面以各个文件作为文件名创建一个目录 里面保存这些m3u8和ts文件

补充说明

  • 批量选择通过 OpenFileDialog 开启多选实现,遍历 FileNames 逐个处理。
  • 目录逻辑:若 textBox1 为空,取视频当前目录,创建 m3u8 文件夹,内部再以文件名(或GUID)建子目录存放切片。
  • 前节代码中实际使用了 Guid.NewGuid().Substring(0, 16) 作为子目录名,核心思想与图示一致(避免重名)。

ffmpeg处理文件路径是空格

  • 如果文件的路径带有空格,那么只需命令的时候会报错
  • 其实这个是和CMD命令有关
  • 如果路径带有空格,我们可以用双引号把路径括起来

补充说明

  • 拼接参数时必须对输入输出路径加双引号,如:" -i \"" + input + "\" ... \"" + output + "\""
  • 前节代码已体现:Arguments = " -i \"" + fileNames[i] + "\" ... \"" + mpath.Trim() + "\\v.m3u8\" ",有效规避空格报错。

改为输出生成的进度

  • 我们在Output事件方法中,可以获得ffmpeg中的执行命令信息,那么我们现在获取每个文件的生成情况
  • 判断只要含有Qavg: 这个则表示这个视频切片成功了,它意思是消耗了时间数

补充说明

  • ErrorDataReceived 事件(即 Output 方法)中,可解析 e.Data
  • 当日志包含 "Qavg:" 时,代表编码结束、切片成功,可在此处更新UI提示成功状态(前节代码注释中保留了相关判断逻辑)。
  • 注意 ffmpeg 输出走错误流,需订阅 ErrorDataReceived 并调用 BeginErrorReadLine()

需要我帮你整合这些要点,写一个完整的进度解析代码示例吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注