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()。
需要我帮你整合这些要点,写一个完整的进度解析代码示例吗?
Previous: winform小工具的设计