2012-10-01 71 views
0

我怎樣才能讓所有的流式JPEG創建一個AVI?如何做循環檢索流圖像?

Bitmap img = eventArgs.Frame; 
for (int i = 0; i < 1000; i++) 
{ 
    //img.SetPixel(i, i, Color.Red); 
    writer.AddFrame(img); 
} 
writer.Close(); 

我得到這個例子從AForge,http://www.aforgenet.com/framework/docs/html/5fedbbbe-6d28-5f69-35a2-9d7119544a2d.htm 但是當我測試它,它創建具有從開始1個相同幀的視頻文件的視頻的結尾。我如何執行writer.AddFrame(img);每次創建新幀的視頻文件?


編輯:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 

using System.Drawing; 
using System.IO; 

using AForge.Video; 
using AForge.Video.VFW; 
using AForge.Video.DirectShow; 

namespace VidRec 
{ 
    public partial class LiveRecording : System.Web.UI.Page 
    { 
     AVIWriter writer = new AVIWriter("MSVC"); //video with compression 

    protected void Page_Load(object sender, EventArgs e) 
    { 
      //camera source 
      string streamingSource = "http://e888.example.com:81/snapshot.cgi"; 

      // create new AVI file and open it 
      writer.Open("c:\\video.avi", 640, 480); 

      //IPcam streaming source to be recorded 
      JPEGStream JPEGSource = new JPEGStream(streamingSource); 
      //MJPEGStream JPEGSource = new MJPEGStream(streamingSource); 
      //login name and password 
      JPEGSource.Login = "login"; 
      JPEGSource.Password = "password"; 
      //set NewFrame event handler 
      JPEGSource.NewFrame += new NewFrameEventHandler(video_NewFrame); 

      //start streaming the image files 
      JPEGSource.Start(); 
    } 

    private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) //event handler for NewFrame 
    { 
     //get frame 
     Bitmap image = eventArgs.Frame; 
     //add the image as a new frame of video file 
     writer.AddFrame(image); 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     writer.Close(); 
    } 
} 

}

回答

0

如果你看看你的例子中,你會發現它們修改圖像中的每個循環。你不這樣做,所以你從頭到尾都有相同的框架。

+0

我如何修改循環,使我得到一個不同的幀? – Lynx

0

您需要將下一張圖片放入您的img中,用於循環的每次迭代。

你把它們加載到一個數組中,然後循環遍歷你的for循環。評論


編輯說,你有10點圖像的名稱1.JPG到10.JPG

你冷做一個這樣的數組。

 Image[] imageAry = new Image[10]; 

     for (int i = 0; i < 10; i++) 
     { 
      imageAry[i] = Image.FromFile(string.Format("{0}.jpg", i + 1)) 
     } 

然後你會在你的for循環中使用你的imageAry數組並迭代每個圖片。

+0

好的,初學者的問題。我怎樣才能做到這一點? – Lynx

+0

如果我不知道我收到的圖像文件名稱是什麼,因爲我從IPcam接收它? – Lynx

+0

好的,我知道我收到的圖像文件,但圖像文件名稱使用時間戳命名。 yyyymmddhhmmss格式。 – Lynx

0

測試一個例子,是沒有多大的變化並取消4號線,如:

Bitmap img = eventArgs.Frame; 
for (int i = 0; i < 1000; i++) 
{ 
    JPEGStream JPEGSource = new JPEGStream(streamingSource); 
    img = (bitmap)JPEGSource; 
    // if JPEGSource is stream not image then use below like instead of above line 
    // img = Image.FromStream(JPEGSource); 
    writer.AddFrame(img); 
} 
writer.Close(); 

如果以上不工作,你該流保存到任何文件夾的名稱作爲timestamp.jpeg那麼你可以使用下面的代碼:

using System.IO; 

現在:

Bitmap img = eventArgs.Frame; 
for (int i = 0; i < 1000; i++) 
{ 
    // JPEGStream JPEGSource = new JPEGStream(streamingSource); 
    // save it to folder like d:\images\ 
    // if you are saving images to folder using any other program 
    // then this might not be needed 
    string[] filePaths = Directory.GetFiles(@"d:\images\"); 
    foreach(string f in filePaths) 
    { 
     img = Image.FromFile(f); 
     writer.AddFrame(img); 
    } 
} 
writer.Close(); 
+0

感謝評論,但這不是我要求的。你提供的東西我已經測試過了,我不想用同一幀創建一個沒有紅線的視頻文件。這是我評論第四行。 – Lynx

+0

這行更新幀和每一幀都不一樣,所以你需要每次都提供新的圖像。你有沒有保存在任何文件夾中的圖像或圖像陣列來創建視頻?從IP攝像機接收到 – sharafjaffri

+0

圖像。 – Lynx