我们刚刚开始尝试gStreamer-Sharp,看看我们是否可以创建管道,以便为我们的.NET软件编写媒体播放器组件。我们在Windows / .NET上运行,而不是在Linux / Mono上运行。
某些管道可以创建,链接和运行没有问题,但其他管道失败。这里缺乏文档和支持,所以我希望有机会在这个领域有一定知识的人会提出我的问题并给我一些提示。
无论如何,没有进一步的麻烦,下面有一个repro-case无法从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的日志记录,或者甚至可能。如果有人可以帮助我,我会非常感激。
感谢。
答案 0 :(得分:1)
在项目维护者的一些提示之后,我发现我的代码中有一些错误。第一个是demux无法链接到mpeg4元素,因为demux只在管道启动时获取其pad。这意味着我只需要在demux元素上处理PadAdded事件,并在那里链接到mpeg4组件。
第二个问题是我需要将颜色空间从YUV转换为RGB,以便directdrawsink接受输入。这将涉及我在其间添加一个ffmpegcolorspace元素。
最后,我根本无法获得调试输出。解决方案是将stderr重定向到Visual Studio 2010中的输出窗口。为此,我转到项目属性 - >调试并将以下命令行参数放入:“2> ErrorLog.txt”(不带引号)。现在我可以看到gStreamer调试输出,它由GST_DEBUG环境变量控制。
辉煌!