2

インターネット上で特定のアプリケーションをストリーミングする方法をテストしています。

アプリケーション インターフェイスをグラフィックス オブジェクト (およびビットマップ) にキャプチャするコードは既にあります。

<video>グーグルで実際に見つけることができない唯一のことは、これを実際にストリームに入れる方法です.vlcを介して、またはHTML5のタグを介して直接接続できます.

明確にするために、MJPEGストリームなどを作成する方法についていくつかの指針が必要です。

アプリケーションをキャプチャするために現在持っているコードは次のとおりです。

LINQPad の C#

void Main()
{
    var hwnd = Process.GetProcessesByName("notepad")[0].MainWindowHandle;
    RECT r;
    if(GetWindowRect(hwnd, out r))
    {
        int width = r.Right - r.Left;
        int height = r.Bottom - r.Top;

        Bitmap bit = new Bitmap(width, height);
        Graphics g = Graphics.FromImage(bit);
        try
        {
            while(true) {
                var hdc = g.GetHdc();
                PrintWindow(hwnd, hdc, 0);
                g.ReleaseHdc(hdc);
                bit.Save(@"C:\temp\img.jpg", ImageFormat.Jpeg);

                Thread.Sleep(25);
            }
        }
        catch { }

        bit.Dispose();
        g.Dispose();
    }
}

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
  public int Left;
  public int Top;
  public int Right;
  public int Bottom;
}

更新用HTML

<!DOCTYPE html>
<html>
<head>
    <title>LiveStream</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <style type="text/css" rel="stylesheet">
    body { margin: 0; padding: 0; }
    </style>
</head>
<body>
    <img src="img.jpg" id="liveID" /><img src="img.jpg" id="hiddenID" style="visibility: hidden; width: 1px; height: 1px;" />
    <script type="text/javascript">
        var img = $('#hiddenID');

        function loadNewImage() {
            var check = $.ajax({ 
                type: 'HEAD', 
                url: 'img.jpg',
                async: false,
                success: function() { 
                    if(check != null) {
                        if(check.getResponseHeader("Content-Length") == null) {
                            return;
                        }
                    } else {
                        return;
                    }
                }
            });
            img.attr('src', 'img.jpg#t=' + new Date().getTime());
        }

        img.load(function() {
            var nImg = document.getElementById('liveID');
            nImg.src = img.attr('src');
            setTimeout(function() { loadNewImage(); }, 50);
        });

        img.error(function() {
            setTimeout(function() { loadNewImage(); }, 250);
        });

        setTimeout(function() { loadNewImage(); }, 50);
    </script>
</body>
</html>
4

0 に答える 0