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的日志记录,或者是否可能。如果有人能在这里帮我,我将非常感激。
谢谢。
经过项目维护人员的一些提示,我发现我的代码中有几个错误。首先,解复用器还不能链接到mpeg4元素,因为解复用器只有在管道启动时才能得到它的pad。这意味着我只需要处理demux元素上的PadAdded事件,并在那里链接到mpeg4组件。
第二个问题是,我需要将颜色空间从YUV转换为RGB,以便directdrawsink接受输入。这将涉及到我在两者之间添加一个ffmpegcolorspace元素。
最后,我根本无法获得调试输出。解决方案是将stderr重定向到VisualStudio2010中的输出窗口。为此,我转到项目属性->调试,并将以下命令行参数放入:"2>ErrorLog.txt"(不带引号)。现在我可以看到gStreamer调试输出,它由GST_debug环境变量控制。
太棒了!