gStreamer Sharp-管道无法链接

本文关键字:链接 管道 Sharp- gStreamer | 更新日期: 2023-09-27 18:27:33

我们刚刚开始试用gStreamer Sharp,看看是否可以创建管道,以便为我们的.NET软件编写媒体播放器组件。我们运行的是Windows/.NET,而不是Linux/Mono。

一些管道可以创建、链接和运行,但其他管道会失败。这方面缺乏文档和支持,所以我希望在这方面有一些知识的人能顺带提出我的问题,给我一些提示。

无论如何,事不宜迟,我在下面有一个repo案例,它无法从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);
        }
    }
}

有趣的是,当我们从命令行启动上面的管道时,它可以正常工作。我们有一种模糊的感觉,在设置管道时,我们可能在这里做了一些错误的事情。它似乎无法将解复用器链接到mpeg4元素。

正如我所建议的,有些管道确实有效。我们也可以在媒体播放器中播放test.mp4,并在其他地方加载它(例如,从命令行使用gStreamer)。

我们也不确定如何打开gStreamer Sharp的日志记录,或者是否可能。如果有人能在这里帮我,我将非常感激。

谢谢。

gStreamer Sharp-管道无法链接

经过项目维护人员的一些提示,我发现我的代码中有几个错误。首先,解复用器还不能链接到mpeg4元素,因为解复用器只有在管道启动时才能得到它的pad。这意味着我只需要处理demux元素上的PadAdded事件,并在那里链接到mpeg4组件。

第二个问题是,我需要将颜色空间从YUV转换为RGB,以便directdrawsink接受输入。这将涉及到我在两者之间添加一个ffmpegcolorspace元素。

最后,我根本无法获得调试输出。解决方案是将stderr重定向到VisualStudio2010中的输出窗口。为此,我转到项目属性->调试,并将以下命令行参数放入:"2>ErrorLog.txt"(不带引号)。现在我可以看到gStreamer调试输出,它由GST_debug环境变量控制。

太棒了!