0

Windows用のgstreamer-sharp/C#を使用して、以下のgstreamerバインディングを使用することができますか?gstreamer-sharpでapplication/x-rtpバインディングを使用する方法?

udpsrc port = 1234! application/x-rtp、payload = 127! rtph264depay! avdec_h264!ビデオコンバート! autovideosink

私は "application/x-rtp、payload = 127"の部分をどうやって行うのか分かりませんが、それは私が逃しているものだと思うが、これについて100%は確信していません。私が使用しようとしているvideosinkはdshowvideosinkです。

ここまで私のコードのrelavent部分です。変数videoDisplayは、フォーム上のWinForms Panelコントロールです。

internal enum videosinktype { glimagesink, d3dvideosink, dshowvideosink, directdrawsink} 

static Element mVideoConv, mUdpcSrc, mDemux, mAvDecH264, mAVSink; 
static Gst.App.AppSink mAppSink; 
static System.Threading.Thread mMainGlibThread; 
static GLib.MainLoop mMainLoop; // GLib's Main Loop 

private const videosinktype mCfgVideosinkType = videosinktype.dshowvideosink; 
private ulong mHandle; 
private Gst.Video.VideoSink mGlImageSink; 
private Gst.Pipeline mCurrentPipeline = null; 

private void InitGStreamerPipeline() 
{ 
    //Assign Handle to prevent Cross-Threading Access 
    mHandle = (ulong)videoDisplay.Handle; 

    //Init Gstreamer 
    Gst.Application.Init();  
    GtkSharp.GstreamerSharp.ObjectManager.Initialize(); 

    mMainLoop = new GLib.MainLoop(); 
    mMainGlibThread = new System.Threading.Thread(mMainLoop.Run); 
    mMainGlibThread.Start(); 

    #region BuildPipeline 
    switch (mCfgVideosinkType) 
    { 
     case videosinktype.glimagesink: 
      mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("glimagesink", "glimagesink"); 
      break; 
     case videosinktype.d3dvideosink: 
      mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("d3dvideosink", "d3dvideosink"); 
      //mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("dshowvideosink", "dshowvideosink"); 
      break; 
     case videosinktype.dshowvideosink: 
      mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("dshowvideosink", "dshowvideosink"); 
      break; 
     case videosinktype.directdrawsink: 
      mGlImageSink = (Gst.Video.VideoSink)Gst.ElementFactory.Make("directdrawsink", "directdrawsink"); 
      break; 
     default: 
      break; 
    } 

    //what's the gstreamer-sharp equivalent of: 
    //application/x-rtp, payload=127 
    //?? 

    mUdpcSrc = ElementFactory.Make("udpsrc", "sink0"); 
    mUdpcSrc["port"] = 1234; 

    mDemux = ElementFactory.Make("rtph264depay", "depay0"); 
    mAvDecH264 = ElementFactory.Make("avdec_h264", "avdech2640"); 
    mVideoConv = ElementFactory.Make("videoconvert", "vidconvert0"); 
    mAVSink = ElementFactory.Make("autovideosink", "video_sink"); 

    mCurrentPipeline = new Gst.Pipeline("pipeline");  
    mCurrentPipeline.Add(mUdpcSrc, mDemux, mAvDecH264, mVideoConv, mAVSink); 

    if (!mVideoTestSource.Link(mVideoSink)) 
    if (mUdpcSrc.Link(mVideoSink))    
    { 
     System.Diagnostics.Debug.WriteLine("Elements could not be linked"); 
    } 
    #endregion 

    //subscribe to bus & bussync msgs 
    Bus bus = mCurrentPipeline.Bus; 
    bus.AddSignalWatch(); 
    bus.Message += HandleMessage; 

    Bus bus = mCurrentPipeline.Bus; 
    bus.EnableSyncMessageEmission(); 
    bus.SyncMessage += new SyncMessageHandler(bus_SyncMessage); 

    //play the stream 
    var setStateRet = mCurrentPipeline.SetState(State.Null); 
    System.Diagnostics.Debug.WriteLine("SetStateNULL returned: " + setStateRet.ToString()); 
    setStateRet = mCurrentPipeline.SetState(State.Ready); 
    System.Diagnostics.Debug.WriteLine("SetStateReady returned: " + setStateRet.ToString()); 
    setStateRet = mCurrentPipeline.SetState(Gst.State.Playing); 
} 

/// <summary> 
/// 
/// </summary> 
/// <remarks> 
/// Indeed the application needs to set its Window identifier at the right time to avoid internal Window creation 
/// from the video sink element. To solve this issue a GstMessage is posted on the bus to inform the application 
/// that it should set the Window identifier immediately. 
/// 
/// API: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideooverlay.html 
/// </remarks> 
/// <param name="o"></param> 
/// <param name="args"></param> 
private void bus_SyncMessage(object o, SyncMessageArgs args) 
{ 
    //Convenience function to check if the given message is a "prepare-window-handle" message from a GstVideoOverlay. 

    System.Diagnostics.Debug.WriteLine("bus_SyncMessage: " + args.Message.Type.ToString()); 
    if (Gst.Video.Global.IsVideoOverlayPrepareWindowHandleMessage(args.Message)) 
    { 
     Element src = (Gst.Element)args.Message.Src; 

#if DEBUG 
     System.Diagnostics.Debug.WriteLine("Message'prepare-window-handle' received by: " + src.Name + " " + src.ToString()); 
#endif 

     if (src != null && (src is Gst.Video.VideoSink | src is Gst.Bin)) 
     { 
      // Try to set Aspect Ratio 
      try 
      { 
       src["force-aspect-ratio"] = true; 
      } 
      catch (PropertyNotFoundException) { } 

      // Try to set Overlay 
      try 
      { 
       Gst.Video.VideoOverlayAdapter overlay_ = new Gst.Video.VideoOverlayAdapter(src.Handle); 
       overlay_.WindowHandle = mHandle;       
       overlay_.HandleEvents(true); 
      } 
      catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Exception thrown: " + ex.Message); } 
     } 
    } 
} 

private void HandleMessage (object o, MessageArgs args) 
{ 
    var msg = args.Message; 
    //System.Diagnostics.Debug.WriteLine("HandleMessage received msg of type: {0}", msg.Type); 
    switch (msg.Type) 
    { 
     case MessageType.Error: 
      // 
      GLib.GException err; 
      string debug; 
      System.Diagnostics.Debug.WriteLine("Error received: " + msg.ToString()); 
      //msg.ParseError (out err, out debug); 
      //if(debug == null) { debug = "none"; } 
      //System.Diagnostics.Debug.WriteLine ("Error received from element {0}: {1}", msg.Src, err.Message); 
      //System.Diagnostics.Debug.WriteLine ("Debugging information: "+ debug); 
      break; 
     case MessageType.StreamStatus: 
      Gst.StreamStatusType status; 
      Element theOwner; 
      msg.ParseStreamStatus(out status, out theOwner); 
      System.Diagnostics.Debug.WriteLine("Case SteamingStatus: status is: " + status + " ; Ownder is: " + theOwner.Name); 
      break; 
     case MessageType.StateChanged: 
      //System.Diagnostics.Debug.WriteLine("Case StateChanged: " + args.Message.ToString()); 
      State oldState, newState, pendingState; 
      msg.ParseStateChanged(out oldState, out newState, out pendingState); 
      if (newState == State.Paused) 
       args.RetVal = false; 
      System.Diagnostics.Debug.WriteLine("Pipeline state changed from {0} to {1}: ; Pending: {2}", Element.StateGetName(oldState), Element.StateGetName(newState), Element.StateGetName(pendingState)); 
      break; 
     case MessageType.Element: 
      System.Diagnostics.Debug.WriteLine("Element message: {0}", args.Message.ToString()); 
      break;     
     default: 
      System.Diagnostics.Debug.WriteLine("HandleMessage received msg of type: {0}", msg.Type); 
      break; 
    } 
    args.RetVal = true; 
} 

答えて

0

application/x-rtp、payload = 127は、udpsrc要素のGstCapsに過ぎません。パッドが追加された信号を聞いて、パッドが作成されるとキャップを追加することができます。

new Caps("application/x-rtp, payload=(int)127"); 
+0

このようにする必要がありますか? <! - language:lang-cs - > var capsRTP = new Caps( "application/x-rtp、payload =(int)127"); // appsinkを設定します mAppSink = new Gst.App.AppSink( "app_sink"); mAppSink ["emit-signals"] = true; mAppSink ["caps"] = capsRTP; mAppSink.NewSample + = NewSample; mCurrentPipeline = new Gst.Pipeline( "pipeline"); mCurrentPipeline.Add(mUdpcSrc、mDemux、mAvDecH264、mVideoConv、mAVSink、mAppSink); <! - language:lang-cs - > 新しいCaps( "application/x-rtp、payload =(int)127");でキャップインスタンスを初期化しようとすると、 – user3583535

+0

が返されます。 結果のCaps objはEMPTYです。 <! - 言語:LANG-CS - > を: はそれが好きで行う必要があります Gst.Global.CapsFromString( "アプリケーション/ X-RTP、ペイロード=(int型)127"); – user3583535

関連する問題