【重要】不要边看文本边操作,本文由错误纠正,先看完一遍再说。

要使用的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】获取电脑可用音视频设备并输出到下拉列表框的更多相关文章

  1. 轻松构建基于 Serverless 架构的弹性高可用音视频处理系统

    前言 随着计算机技术和 Internet 的日新月异,视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育.娱乐等行业青睐,而在当前, 云计算平台厂商的产品线不断成熟完善, 如果想要搭建视频点播类 ...

  2. php使用ffmpeg获取上传的视频的时长,码率等信息

    视频上传是程序员在很多时候需要用到的操作,然而上传完视频肯定要获得一些视频的详细信息,php本身是不支持信息获取的 ,所以采用ffmpeg第三方插件 首先你需要下载ffmpeg文件:官网地址:http ...

  3. moviepy音视频剪辑:输出文件前预览剪辑和视频帧的preview和imdisplay方法

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 由于moviepy合成剪辑后,输出需要较多的时间,那么在输出前预览一下有助于提高处理效率.moviepy提供了预览的工具,这个工具是基于pygame ...

  4. ffmpeg实战-音视频基础概念

    转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...

  5. FFmpeg处理音视频流程学习笔记

    原文作者:一叶知秋0830 链接:https://www.jianshu.com/p/1b715966af50 FFmpeg处理音视频完整流程包括5个阶段(输入文件—>编码数据包—>解码后 ...

  6. 1┃音视频直播系统之浏览器中通过WebRTC访问摄像头

    一.WebRTC的由来 对于前端开发小伙伴而言,如果用 JavaScript 做音视频处理 在以前是不可想象的,因为首先就要考虑浏览器的性能是否跟得上音视频的采集 但是 Google 作为国际顶尖科技 ...

  7. C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)

    不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...

  8. anyRTC Web SDK 实现音视频呼叫功能

    前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...

  9. 音视频开发之H.264 入门知识

    大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考. 基础概念 H.26 ...

  10. 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!

    概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...

随机推荐

  1. foobar2000 v1.6.13 汉化版(更新于2022.11.22)

    foobar2000 v1.6.13 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  2. 墨天轮沙龙 | 亚马逊云科技李君:见微知著 - Serverless云原生数据库概览

    导读 以业务为导向的数据库需要满足现代化应用的需要,以 Serverless 数据库为代表,云数据库正在迅速发展成熟,并带来更好的可访问性和高可用性,还有高扩展性与可迁移性. [墨天轮数据库沙龙-Se ...

  3. Vue3 的 nextTick 函数

    作用: DOM 渲染是异步耗时的, vue2.x 需要等到 DOM 渲染完成之后做某个事情,需要使用 this.$nextTick , vue3.x 则直接提供了 nextTick 这个方法去实现 : ...

  4. linux 配置apache的虚拟主机

    基于web的开发,若没有配置虚拟主机,一直在浏览器输入localhost/projectname有点复杂 特别是类似thinkphp框架的,一大串:localhost/php/tp5/public.. ...

  5. 云电脑玩游戏挑选标准,ToDesk实测体验

    大家玩游戏还在攒机吗?与其花费时间精力在组装游戏电脑上,不如用上最近兴起的云电脑软件.无需额外配备硬件设备,旧电脑原地变身成高性能电脑,随时随地享受游戏乐趣. 但市面上众多的云电脑软件,该怎么选择才能 ...

  6. 思科 ISE 3.4 发布新增功能概览

    思科 ISE 3.4 发布,新增功能概览   目录 Active Directory 首选 DC 选择 保留使用设置 本地化 ISE 安装 FQDN 到 SGT 映射 思科 ISE 和 TrustSe ...

  7. ESP8266 + mg90s(舵机)

    ESP8266+mg90s(舵机) 准备阶段 ESP8266(nodeMcu) MG90S(舵机) 面包板 线3 连线 ESP8266 MG90S(舵机) GND 棕色 VCC 红色 模拟引脚 橙色 ...

  8. docker新建自定义网桥,实现不同主机容器互联

    不同主机间的容器网络互联,网络上的所有教程都是通过open vswitch等虚拟网桥方式实现的,但是最近本人发现可以直接通过配置网桥实现网络的互联,而不用安装配置open vswitch.在这里分享一 ...

  9. orange pi 香橙派 zero 刷openwrt当作有wifi的小路由器用

    前面写过我用香橙派zero来测量温度 https://www.cnblogs.com/jar/p/15848178.html 最近准备把他改造成路由器 https://www.right.com.cn ...

  10. git pull发现有ahead of xx commits问题如何解决

    git pull 的时候发现有提示你ahead of xx commits 这个时候怎么办呢? 直接一句话定位到远程最新分支 git reset --hard origin/分支名称