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

要使用的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. [rCore学习笔记 029] 动态内存分配器实现-以buddy_system_allocator源码为例

    在上一部分,我们讲了动态内存分配器的原理是维护一个堆,而且是实现各种连续内存分配方法. 但是上一部分是直接通过引用了buddy_system_allocator来解决的问题. 那么对于内存分配算法有兴 ...

  2. 深入理解Android MTP之存储映射分析

    深入理解Android MTP之UsbService启动分析 分析了MTP的服务端的启动,本文来分析切换MTP模式后,存储中的数据(文件.目录)是如何映射到PC端的. 首先你得知道如何切换MTP模式. ...

  3. C#的引用类型

    引用类型的基类为 Object 引用类型:类Class.接口Interface.委Delegrate.数组Array

  4. C# Webapi 简单的依赖注入-构造函数

    控制器部分: using Microsoft.AspNetCore.Mvc; using WebApplication1.IServices; using WebApplication1.Utilit ...

  5. 小程序按住选中 text

    <text selectable>按住选中可以赋值的</text>

  6. 常见return错误

    常见return错误 3221225477 (0xC0000005): 访问越界,一般是读或写了野指针指向的内存. 3221225725 (0xC00000FD): 堆栈溢出,一般是无穷递归造成的. ...

  7. PXI板卡的封装和接口形式

    PXI模块 PXI标准同时定义了3U和6U模块适用的机械尺寸与连接器形式.3U模块在模块底部安装有一个助拔手柄.在顶部和底部通过螺钉固定,底部的固定螺钉部分隐藏在助拔手柄中.占用超过一个槽位的模块可以 ...

  8. 4. jenkins的配置

    Maven安装和配置 ​ 在Jenkins集成服务器上,我们需要安装Maven来编译和打包项目. 安装Maven 先上传Maven软件到192.168.66.101 tar -xzf apache-m ...

  9. 案例分享-导致MySQL崩溃的SQL语句

    背景 周一刚上班一个开发小哥火急火燎的过来找我,黑龙江某客户私有化环境的服务过一阵就报数据库连接失败,不知道是什么原因导致的,我以为是客户调整了网络,但是客户说并没有做任何调整,我使用ping测试也看 ...

  10. Air780E的I2C软件使用指南

    ​ 今天我们学习合宙低功耗4G模组Air780E的I2C接口操作方法,文末[阅读原文]获取最新资料. 一.I2C概述 Air780E可支持1路I2C接口,如果复用的话最多有两路: ​ I2C配置: 兼 ...