2012-03-13 64 views
2

我們剛剛開始嘗試gStreamer-Sharp,以瞭解是否可以創建管道,以便爲我們的.NET軟件編寫媒體播放器組件。我們運行在Windows/.NET上,而不是Linux/Mono。gStreamer-Sharp - pipeline無法鏈接

一些管道可以創建,鏈接和運行沒有問題,但其他管道失敗。這裏缺少文檔和支持,所以我希望在這個領域裏有一些具有一定知識的人在我的問題的驅使下給我一些提示。

無論如何,沒有進一步的道理,我有一個下面的再生案例,無法從avidemux元素鏈接到mpeg4元素。

using System.Windows.Forms; 
using Gst; 
using Gst.Interfaces; 

namespace gStreamerTest 
{ 
    public partial class MainForm : Form 
    { 
     // Pipeline. 

     private Gst.Pipeline MyPipeline; 



     // Elements. 

     private Gst.Element MyFileSource, MyDemux, MyMpeg4, MyDrawSink; 




     // Overlay adapter. 

     private XOverlayAdapter MySinkAdapter; 




     public MainForm() 
     { 
      InitializeComponent(); 




      // Initialise gStreamer. 

      Gst.Application.Init();    




      // Create new pipeline. 

      MyPipeline = new Gst.Pipeline(); 

      Pipeline pipeline = new Pipeline("pipeline"); 




      // Construct pipeline filesrc -> avidemux -> mpeg4 -> directdrawsink 

      MyFileSource = ElementFactory.Make("filesrc", "filesrc"); 
      MyFileSource["location"] = "c:\\test.mp4"; 
      MyDemux = ElementFactory.Make("avidemux", "avidemux"); 
      MyMpeg4 = ElementFactory.Make("ffdec_mpeg4", "ffdec_mpeg4"); 
      MyDrawSink = ElementFactory.Make("directdrawsink", "directdrawsink"); 




      // Output to our window. 

      MySinkAdapter = new XOverlayAdapter(MyDrawSink.Handle); 
      MySinkAdapter.XwindowId = (ulong)this.Handle; 




      // Add and link pipeline. 

      MyPipeline.Add(MyFileSource, MyDemux, MyMpeg4, MyDrawSink); 

      if (!MyFileSource.Link(MyDemux)) 
      { 

      } 

      if (!MyDemux.Link(MyMpeg4)) 
      { 
       // FAILS HERE 
      } 

      if (!MyMpeg4.Link(MyDrawSink)) 
      { 

      } 


      // Play video. 

      MyPipeline.SetState(Gst.State.Playing); 
     } 
    } 
} 

有趣的是,當我們從命令行啓動它時,上述管道工作正常。我們有一種模糊的感覺,我們可能在設置管道時在這裏做了不正確的事情。它似乎在將demux鏈接到mpeg4元素時失敗了。

正如我所建議的,一些管道工作。我們也可以在媒體播放器中播放test.mp4並在別處加載它(例如,使用命令行中的gStreamer)。

我們也不確定如何開啓gStreamer-Sharp的日誌記錄功能,或者甚至有可能。如果有人能幫助我,我會非常感激。

謝謝。

回答

1

從項目維護者的一些提示後,我看到我的代碼中有幾個錯誤。第一個原因是demux不能鏈接到mpeg4元素,因爲demux只有在流水線啓動時才能獲得它的焊盤。這意味着我只需處理demux元素上的PadAdded事件並在那裏執行到mpeg4組件的鏈接。

第二個問題是我需要將顏色空間從YUV轉換爲RGB,以便直接繪製器接受輸入。這將涉及到我之間添加一個ffmpegcolorspace元素。

最後,我根本得不到調試輸出。解決方案是將stderr重定向到Visual Studio 2010中的輸出窗口。爲此,我去了項目屬性 - >調試,並將以下命令行參數放在:「2> ErrorLog.txt」(不帶引號)中。現在我可以看到gStreamer調試輸出,該輸出由GST_DEBUG環境變量控制。

太棒了!