如何编程实现 “实时监测电脑声卡是否发声” 这一需求?

事件背景:
Windows下写了一个exe程序(目的是24小时持续运行挂机看视频),该程序内嵌了一个超文本浏览框,会打开指定URL并播放该URL里面的视频。但偶尔会出现缓冲的情况,有时候会卡在缓冲界面很久,此时需要刷新一下才可以正常播放。

待解决的需求:
无人值守 的情况下,程序自动判断该视频是否正常播放。如果在缓冲界面了,程序就自动刷新一下。

设想的方案:
在程序里加一个线程,实时监听着声卡,如果长达5分钟都没有声音发出,则说明视频卡住了,没有正常播放。于是开始刷新url重新加载。(该Windows系统内只运行这一个程序,其他能发声的软件全部卸载。且该视频正常播放期间一直都有声音,视频内不存在连续1分钟无人发声的情况)

最终的问题:
1、这个设想的方案是否可行?
2、(重点问这个)如果可行,如何用C# (或者易语言)来实现检测声卡是否发出了声音?
3、有没有其他方法实时监测视频是否正常播放?(如检测进度条的像素变化、某一画面区域是否长期静止等)

谢谢您的关注!

阅读 7.2k
4 个回答

如果是网络原因导致视频卡顿,不需要搞那么复杂呢。

可直接监控进程 IO 流量,若视频卡顿,流量必然不正常(偏小或为零)。这只需要一个 API 函数 GetProcessIoCounters()

参考

GetProcessIoCounters, https://msdn.microsoft.com/en...

例子

using System;
using System.Threading;
using System.Runtime.InteropServices;


public class Monitor
{
    [StructLayout(LayoutKind.Sequential)]
    public struct IO_COUNTERS {
        public ulong ReadOperationCount;
        public ulong WriteOperationCount;
        public ulong OtherOperationCount;
        public ulong ReadTransferCount;
        public ulong WriteTransferCount;
        public ulong OtherTransferCount;
    }

    [DllImport("kernel32")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32")]
    static extern bool GetProcessIoCounters(IntPtr process, ref IO_COUNTERS pCounters);

    public static void MonitorCounters()
    {
        IO_COUNTERS pCounters = new IO_COUNTERS();
        while (GetProcessIoCounters(GetCurrentProcess(), ref pCounters)) {
            Console.WriteLine(String.Format("READ: %d, WRITE: %d", pCounters.ReadTransferCount, pCounters.WriteTransferCount));
            Thread.Sleep(1);
        }
    }
}


public class Program
{
    public static void Main()
    {
        Monitor.MonitorCounters();
    }
}

说个题外话,推荐你学习 python,易学且功能强大。

舍近求远了

直接一点,易语言的超文本浏览框底层是使用了WebBrowser对象,可以用超文本浏览框n.取浏览器对象()得到IWebBrowser2对象,并进行相关的网页层面操作。
具体如何操作需要看网页结构。

C#也是WebBrowser对象,但是似乎做了层封装,也可以参考以上思路。

www.autohotkey.com

换个思路,截图比较相对而言更容易实现

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进