【重要】不要边看文本边操作,本文有错误纠正,先看完一遍再说。
ffmpeg -list_devices true -f dshow -i dummy
- List<string> videoList=new List<string>();
- foreach (Match item in Regex.Matches(this.info, "] \"(.*?)\" \\(video\\)"))
- videoList.Add(item.Value.Replace("]\"","").Replace("\"(video)", ""));
- List<string> audioList = new List<string>();
- foreach (Match item in Regex.Matches(this.info, "] \"(.*?)\" \\(audio\\)"))
- audioList.Add(item.Value.Replace("]\"", "").Replace("\"(audio)", ""));
1.完全不了解正则表达式的去看看C# 正则表达式 | 菜鸟教程
2.我本来想的是,加了括号(.*?),匹配出来的应该不包括 ]"
和 "(video)
但是它又确实包括了,于是我只能使用替换的方式将我不要的内容给替换掉
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
-
- namespace why_not_fly
- {
- internal class MediaInfo
- {
- public string info = null;
- public string error = null;
- public bool isFinish = false;
- Media media = new Media();
- public List
string>> getDevices() {
- List<string> list = new List<string>() { "-list_devices true -f dshow -i dummy" };
- media.Start(list);
- media.process.ErrorDataReceived += new DataReceivedEventHandler(ProcessOutputHandler);
- while (!isFinish)
- {
- //等待完成
- }
- MessageBox.Show(info);
- List<string> videoList=new List<string>();
- foreach (Match item in Regex.Matches(this.info, "] \"(.*?)\" \\(video\\)"))
- videoList.Add(item.Value.Replace("] \"","").Replace("\" (video)", ""));
- List<string> audioList = new List<string>();
- foreach (Match item in Regex.Matches(this.info, "] \"(.*?)\" \\(audio\\)"))
- audioList.Add(item.Value.Replace("] \"", "").Replace("\" (audio)", ""));
- return new List
string>>() { videoList, audioList };
- }
- //设置回调,读取指令的返回值
- private void ProcessOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
- {
- try
- {
- //进程间通信,解决线程中调用控件错误
- Control.CheckForIllegalCrossThreadCalls = false;
- if (!String.IsNullOrEmpty(outLine.Data))
- {
- info += outLine.Data + Environment.NewLine;
- }
- else
- {
- isFinish = true;
- }
- }
- catch (Exception ex)
- {
- error = ex.ToString();
- }
- }
- }
- }
3.注意符号之间的空格
如下图,是有空格的
你要是空格没写或者写的不对,就取不出来了。
然后准备两个下拉列表框,载入窗口的时候就读取设备信息
读取完成!
难点的话其实也就是正则表达式提取内容,只要内容能提取出来,那一切都比较好办了。
然后关于读取设备遇到乱码问题,请看【C#】【ffmpeg】外部调用线程执行ffmepg读取返回的信息乱码问题
我估计可能获取的这些信息还不够,后面再更新。