鍍金池/ 問(wèn)答/C  C#  影視/ 如何編程實(shí)現(xiàn) “實(shí)時(shí)監(jiān)測(cè)電腦聲卡是否發(fā)聲” 這一需求?

如何編程實(shí)現(xiàn) “實(shí)時(shí)監(jiān)測(cè)電腦聲卡是否發(fā)聲” 這一需求?

事件背景:
Windows下寫(xiě)了一個(gè)exe程序(目的是24小時(shí)持續(xù)運(yùn)行掛機(jī)看視頻),該程序內(nèi)嵌了一個(gè)超文本瀏覽框,會(huì)打開(kāi)指定URL并播放該URL里面的視頻。但偶爾會(huì)出現(xiàn)緩沖的情況,有時(shí)候會(huì)卡在緩沖界面很久,此時(shí)需要刷新一下才可以正常播放。

待解決的需求:
無(wú)人值守 的情況下,程序自動(dòng)判斷該視頻是否正常播放。如果在緩沖界面了,程序就自動(dòng)刷新一下。

設(shè)想的方案:
在程序里加一個(gè)線程,實(shí)時(shí)監(jiān)聽(tīng)著聲卡,如果長(zhǎng)達(dá)5分鐘都沒(méi)有聲音發(fā)出,則說(shuō)明視頻卡住了,沒(méi)有正常播放。于是開(kāi)始刷新url重新加載。(該Windows系統(tǒng)內(nèi)只運(yùn)行這一個(gè)程序,其他能發(fā)聲的軟件全部卸載。且該視頻正常播放期間一直都有聲音,視頻內(nèi)不存在連續(xù)1分鐘無(wú)人發(fā)聲的情況)

最終的問(wèn)題:
1、這個(gè)設(shè)想的方案是否可行?
2、(重點(diǎn)問(wèn)這個(gè))如果可行,如何用C# (或者易語(yǔ)言)來(lái)實(shí)現(xiàn)檢測(cè)聲卡是否發(fā)出了聲音?
3、有沒(méi)有其他方法實(shí)時(shí)監(jiān)測(cè)視頻是否正常播放?(如檢測(cè)進(jìn)度條的像素變化、某一畫(huà)面區(qū)域是否長(zhǎng)期靜止等)

謝謝您的關(guān)注!

回答
編輯回答
孤島

www.autohotkey.com

2017年12月13日 00:41
編輯回答
喜歡你

如果是網(wǎng)絡(luò)原因?qū)е乱曨l卡頓,不需要搞那么復(fù)雜呢。

可直接監(jiān)控進(jìn)程 IO 流量,若視頻卡頓,流量必然不正常(偏小或?yàn)榱悖?。這只需要一個(gè) API 函數(shù) 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();
    }
}

說(shuō)個(gè)題外話,推薦你學(xué)習(xí) python,易學(xué)且功能強(qiáng)大。

2018年8月7日 03:49
編輯回答
離夢(mèng)

換個(gè)思路,截圖比較相對(duì)而言更容易實(shí)現(xiàn)

2018年5月14日 07:55
編輯回答
夏木

舍近求遠(yuǎn)了

直接一點(diǎn),易語(yǔ)言的超文本瀏覽框底層是使用了WebBrowser對(duì)象,可以用超文本瀏覽框n.取瀏覽器對(duì)象()得到IWebBrowser2對(duì)象,并進(jìn)行相關(guān)的網(wǎng)頁(yè)層面操作。
具體如何操作需要看網(wǎng)頁(yè)結(jié)構(gòu)。

C#也是WebBrowser對(duì)象,但是似乎做了層封裝,也可以參考以上思路。

2018年7月23日 05:35