【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
【重要】不要边看文本边操作,本文由错误纠正,先看完一遍再说。
要使用的FFmpeg命令

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.完全不了解正则表达式的去看看https://www.runoob.com/csharp/csharp-regular-expressions.html
2.我本来想的是,加了括号(.*?),匹配出来的应该不包括 ]" 和 "(video)
3.注意符号之间的空格
如下图,是有空格的

你要是空格没写或者写的不对,就取不出来了。
但是它又确实包括了,于是我只能使用替换的方式将我不要的内容给替换掉
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<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<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();
}
}
}
}
然后准备两个下拉列表框,载入窗口的时候就读取设备信息


读取完成!
难点的话其实也就是正则表达式提取内容,只要内容能提取出来,那一切都比较好办了。
然后关于读取设备遇到乱码问题,请看【C#】【ffmpeg】外部调用线程执行ffmepg读取返回的信息乱码问题
我估计可能获取的这些信息还不够,后面再更新。
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框的更多相关文章
- 轻松构建基于 Serverless 架构的弹性高可用音视频处理系统
前言 随着计算机技术和 Internet 的日新月异,视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育.娱乐等行业青睐,而在当前, 云计算平台厂商的产品线不断成熟完善, 如果想要搭建视频点播类 ...
- php使用ffmpeg获取上传的视频的时长,码率等信息
视频上传是程序员在很多时候需要用到的操作,然而上传完视频肯定要获得一些视频的详细信息,php本身是不支持信息获取的 ,所以采用ffmpeg第三方插件 首先你需要下载ffmpeg文件:官网地址:http ...
- moviepy音视频剪辑:输出文件前预览剪辑和视频帧的preview和imdisplay方法
☞ ░ 前往老猿Python博文目录 ░ 一.引言 由于moviepy合成剪辑后,输出需要较多的时间,那么在输出前预览一下有助于提高处理效率.moviepy提供了预览的工具,这个工具是基于pygame ...
- ffmpeg实战-音视频基础概念
转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...
- FFmpeg处理音视频流程学习笔记
原文作者:一叶知秋0830 链接:https://www.jianshu.com/p/1b715966af50 FFmpeg处理音视频完整流程包括5个阶段(输入文件—>编码数据包—>解码后 ...
- 1┃音视频直播系统之浏览器中通过WebRTC访问摄像头
一.WebRTC的由来 对于前端开发小伙伴而言,如果用 JavaScript 做音视频处理 在以前是不可想象的,因为首先就要考虑浏览器的性能是否跟得上音视频的采集 但是 Google 作为国际顶尖科技 ...
- C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)
不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...
- anyRTC Web SDK 实现音视频呼叫功能
前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...
- 音视频开发之H.264 入门知识
大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考. 基础概念 H.26 ...
- 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!
概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...
随机推荐
- 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果
最近更新一个Blazor server的项目,顺带把用到的Ant-Design-Blazor 升级到了最新的 0.14.4,结果发现之前在 0.8.4 版本中 Tree 组件的搜索显示效果变了,从仅显 ...
- iOS开发Block使用详解
项目开发中经常会用到页面之间传值的问题,常用的方法是通知.单例.代理.block等.最近项目忙完,有空细细研究了一下block的用法,收货多多. block又称闭包,它的实现原理是c语言的函数指针.函 ...
- ios中文件夹文件的创建和删除
//1.文件夹.文件的创建和删除 NSFileManager *fileManager=[NSFileManager defaultManager]; NSString *filePath=@&quo ...
- 015 Python 的输入输出和字符串格式化(终于可以和计算机交流了)
#!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/26 20:11 # Filename:015 Python 的输入输出和 ...
- NOI 2024
Day1 T1 集合(set) 容易发现两个序列等价当且仅当,所有数字在序列中出现位置的集合构成集族相等. 考虑哈希,对于一个集合 \(S\),令它的哈希值为 \(f(S) = (\sum\limit ...
- 妙用编辑器:使用Notepad--的标记颜色功能更高效的阅读日志文件
应用场景 在日常维护工作中,经常需要查看一些日志,以判断系统的运行状态或者进行问题定位,当系统出现故障时,一般都会有特殊的关键字,但对于浩如烟海的日志来说,识别这些关键字信息还是非常费眼力的,比如有如 ...
- 我在大厂做 CR——为什么建议使用枚举来替换布尔值
使用枚举替换布尔值主要基于以下几个原因 ● 可读性 ● 可拓展性 ● 安全防控 可读性 我们会定义 boolean 类型(true 或 false)作为方法参数,虽然比较简洁,但有时候参数的含义往往不 ...
- 在 VMware vSphere 中构建 Kubernetes 存储环境
作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes.KubeSphere.kubekey等. 相信很多小伙伴和企业在构建容器集群时都会考虑存储 ...
- C语言之常量
常量 常量,常量表达式和const关键字修饰的只读变量都存储在.rodata只读数据段中 1.字面值常量 literal 整形字面值 123, 0xff00ff 字符常量,类型总是 int, 'a', ...
- Linux基础-学会使用命令帮助
概述 使用 whatis 使用 man 查看命令程序路径 which 总结 参考资料 概述 Linux 命令及其参数繁多,大多数人都是无法记住全部功能和具体参数意思的.在 linux 终端,面对命令不 ...