2017-12-14 31 views
1

IPカメラからストリーミングされているWebページからスクリーンショットを取得しようとしているので、triggerWebBrowserReadyState.Completeはありません。読み込みを停止しないWebページの画像

問題のWebページは文字通りmjpegでストリーミングされており、ブラウザは常にロード/ストリーミングしています。

他のURLの画像を生成することはできますが、「Navigation Cancelled」以外のものを入力することはできません。

私はWebBrowser.Stop()を試してみましたが、無駄に...

Webページは、単にMJPEGです:

<img class"shrink" src="192.168.1.124/Streaming/channels/1/httpPreview"; alt="192.168.1.124/Streaming/channels/1/httpPreview"; class="shrinkToFit" height="148" width="217"> </img> 

using Telegram.Bot; 
using System.Threading.Tasks; 
using System.IO; 
using Telegram.Bot.Types; 
using System.Threading; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Drawing.Imaging; 

namespace Telegram_Alerter 
{ 
    public static class BitmapExtensions 
    { 
     public static void SaveJPG100(this Bitmap bmp, string filename) 
     { 
      var encoderParameters = new EncoderParameters(1); 
      encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
      bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
     } 

     public static void SaveJPG100(this Bitmap bmp, Stream stream) 
     { 
      var encoderParameters = new EncoderParameters(1); 
      encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
      bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
     } 

     public static ImageCodecInfo GetEncoder(ImageFormat format) 
     { 
      var codecs = ImageCodecInfo.GetImageDecoders(); 

      foreach (var codec in codecs) 
      { 
       if (codec.FormatID == format.Guid) 
       { 
        return codec; 
       } 
      } 

      // Return 
      return null; 
     } 
    } 

    class Program 
    { 
     static public void Main(string[] args) 
     { 
      TelegramMessageAsync().Wait(); 
     } 

     static public async Task TelegramMessageAsync() 
     { 
      TelegramBotClient Bot = new TelegramBotClient("<mykey>"); 
      WebsiteToImage websiteToImage = new WebsiteToImage("http://192.168.1.124/Streaming/channels/1/httpPreview", Application.StartupPath + "file.jpg"); 
      websiteToImage.Generate(); 
      using (FileStream fs = System.IO.File.OpenRead(Application.StartupPath + "file.jpg")) 
      { 
       FileToSend fts = new FileToSend(); 
       fts.Content = fs; 
       fts.Filename = "file.jpg"; 
       await Bot.SendPhotoAsync(<bot>, fts, "message here"); 
      } 
     } 

     public class WebsiteToImage 
     { 
      private Bitmap m_Bitmap; 
      private string m_Url; 
      private string m_FileName = string.Empty; 

      public WebsiteToImage(string url) 
      { 
       // Without file 
       m_Url = url; 
      } 

      public WebsiteToImage(string url, string fileName) 
      { 
       // With file 
       m_Url = url; 
       m_FileName = fileName; 
      } 

      public Bitmap Generate() 
      { 
       // Thread 
       var m_thread = new Thread(_Generate); 
       m_thread.SetApartmentState(ApartmentState.STA); 
       m_thread.Start(); 
       m_thread.Join(); 
       return m_Bitmap; 
      } 

      private void _Generate() 
      { 
       var browser = new WebBrowser { ScrollBarsEnabled = false }; 
       browser.Navigate(m_Url); 
       browser.DocumentCompleted += WebBrowser_DocumentCompleted; 
       while (browser.ReadyState != WebBrowserReadyState.Complete) 
       { 

        Application.DoEvents(); 
       } 

       browser.Dispose(); 
      } 

      private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
      { 
       // Capture 
       var browser = (WebBrowser)sender; 
       browser.ClientSize = new Size(1024,768); 
       browser.ScrollBarsEnabled = false; 
       m_Bitmap = new Bitmap(1024,768); 
       browser.BringToFront(); 
       browser.DrawToBitmap(m_Bitmap, browser.Bounds); 

       // Save as file? 
       if (m_FileName.Length > 0) 
       { 
        // Save 
        m_Bitmap.SaveJPG100(m_FileName); 
       } 
      } 
     } 
    } 
} 
+0

「ウェブページの読み込みが停止するのは、 」とはどのように判断していますか? –

+0

Application.DoEvents?ブラウザを破棄するには、DocumentCompletedイベントの最後に行います。 – LarsTech

+0

基本的に問題は、ブラウザのドキュメントが完成せず、ビデオストリームの一部のフレーム*を含むいくつかのコンテンツを表示するために十分に進んだ時点を特定する必要があることです。 – grek40

答えて

0

私は、N.Recoと呼ばれるFFMpeg .NETラッパーを使用して質問に答えました。これは、1つのフレームを取得してJPEGに変換するためにMJPEGを解析することを心配する必要がないことを意味しています。

これは2行のコードで達成されましたが、FFMPEGはアプリケーションに20Mbを追加します。

 var ffmpeg = new NReco.VideoConverter.FFMpegConverter(); 
     ffmpeg.GetVideoThumbnail(pathToVideoFile, Application.StartupPath + stamp); 
0

たぶん、そのページは決してload.IfはいIフレームが含まれています:

private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
    // to check if it is not Iframe 
if (e.Url.AbsolutePath != this.webBrowser.Url.AbsolutePath) 
          { 
           // Capture 
           var browser = (WebBrowser)sender; 
           browser.ClientSize = new Size(1024,768); 
           browser.ScrollBarsEnabled = false; 
           m_Bitmap = new Bitmap(1024,768); 
           browser.BringToFront(); 
           browser.DrawToBitmap(m_Bitmap, browser.Bounds); 

           // Save as file? 
           if (m_FileName.Length > 0) 
           { 
            // Save 
            m_Bitmap.SaveJPG100(m_FileName); 
           } 
          } 
       } 
+0

ありがとう@ ariaman5しかし、IPカメラは常にフレームのビデオを読み込んでいますが、iframeにはロードされていないため、オプションが機能しませんでした。私はまた、あなたの提案したコードをtweekの上に置く必要がありました。 –

関連する問題