2012-03-13 13 views
2

.NETソフトウェア用のメディアプレーヤーコンポーネントを作成する目的で、gStreamer-Sharpを試してみました。私たちはLinux/Monoではなく、Windows/.NET上で動作しています。gStreamer-Sharp - パイプラインがリンクに失敗する

いくつかのパイプラインは問題なく作成、リンク、実行できますが、それ以外は失敗します。そこにはドキュメンテーションとサポートが不足しているので、この分野の知識を持っている人が私の質問に追い込まれ、私にいくつかのヒントを与えてくれるはずです。

とにかく、それ以上の騒ぎをせずに、私は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

プロジェクト管理者からのヒントの後、私のコードにいくつか間違いがあることがわかります。最初は、デマルチプレクサはmpeg4要素にまだリンクできません。デマルチプレクサはパイプラインの開始時にパッドを取得するだけです。これは、単に、demux要素のPadAddedイベントを処理し、そこでmpeg4コンポーネントへのリンクを行うだけで済むことを意味します。

第2の問題は、DirectDrawsinkが入力を受け入れるために色空間をYUVからRGBに変換する必要があることです。これには、ffmpegcolorspace要素を中間に追加する必要があります。

最後に、デバッグ出力を取得できませんでした。これを解決するには、Visual Studio 2010でstderrを出力ウィンドウにリダイレクトします。これを行うには、プロジェクトのプロパティ - >デバッグに行き、次のコマンドライン引数を "2> ErrorLog.txt"(引用符なし)に入れてください。これでGST_DEBUG環境変数で制御されるgStreamerのデバッグ出力を見ることができます。

ブリリアント!

関連する問題