2015-10-09 73 views
1

進程中運行一個讀取帶有FFMPEG的RTSP流的命令,並且我需要捕獲每個幀以將其顯示在一個picturebox中;我收到無效OnOutputDataReceived(對象發件人,DataReceivedEventArgs e)中的數據,但是一旦我將e.data轉換爲byte [],並生成應用程序崩潰的位圖。使用FFMPEG進程從rtsp

我的代碼:

private void Form1_Load_1(object sender, EventArgs e) 
    { 
     Process proc = new Process(); 
     proc.StartInfo.FileName = "ffmpeg"; 
     proc.StartInfo.Arguments = "-i rtsp://user:[email protected]:9826/videoMain -an -vcodec mjpeg -s 640x480 -threads 1 -aspect 16:9 -q:v 2 -updatefirst 1 -b:v 64k -f -"; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.OutputDataReceived += OnOutputDataReceived; 
     if (!proc.Start()) 
     { 
      Console.WriteLine("Error starting"); 
      return; 
     } 
     proc.BeginOutputReadLine(); 
     StreamReader reader = proc.StandardError; 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 
     proc.Close(); 
    } 

    void OnOutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     byte[] bytes = new byte[e.Data.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(e.Data.ToCharArray(), 0, bytes, 0, bytes.Length); 
     Bitmap bmp; 
     using (var ms = new MemoryStream(bytes)) 
     { 
    // CRASH SITE 

      bmp = new Bitmap(ms); 
     } 
     pictureBox1.Image = bmp; 
    } 

Bytes

Crash

+0

我不知道很多關於ffmpeg的,但如果有任何視頻進行流進來,您收到多個幀。並且您似乎沒有做任何事情來檢測您的渲染部分的幀終止符 – fahadash

回答

0

如果你想從相機處理圖像文件,FFMPEG的使用是不是最好的方式,因爲you're加入設備和.NET代碼之間的獨立層。

你需要使用AFORGE.NET,它是專門爲它做的。我向FOSCAM相機(Windows桌面版和WinPhone 7x)提供了兩個應用程序,AFORGE是他們的最佳選擇。不幸的是,我沒有代碼了,但嘗試AFORGE,而不是堅持FFMPEG(我猜AFORGE有樣品輸出到FFMPEG)。

在這裏看到: http://www.aforgenet.com/framework/

+0

Aforgenet不支持RTSP,因爲作者在此處陳述:http://www.aforgenet.com/forum/viewtopic.php?f= 2 T = 2273 – Jerther