c# - gStreamer-Sharp - 管道无法链接

标签 c# gstreamer

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

某些管道可以创建、链接并运行,没有问题,但其他管道则失败。目前缺乏这方面的文档和支持,所以我希望在这个领域有一定知识的人偶尔会提出我的问题并给我一些提示。

无论如何,事不宜迟,我下面有一个重现案例,无法从 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 重定向到 Visual Studio 2010 中的输出窗口。为此,我转到项目属性 -> 调试并将以下命令行参数放入:“2 > ErrorLog.txt”(不带引号)。现在我可以看到 gStreamer 调试输出,该输出由 GST_DEBUG 环境变量控制。

太棒了!

关于c# - gStreamer-Sharp - 管道无法链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9685318/

相关文章:

opencv - Gstreamer RTP传输视频+文字

c# - 在表达式中引用通用属性

c# - 如何阻止事件触发 + ASP.NET

c# - Linq 查询返回过滤后的数据

android - 使用 gstreamer 在 Android 上播放 RTMP 流

Gstreamer 缺少插件

c# - 2个线程处理异常行为的套接字

c# - 我的数据源包含一个值,但 EVAL 不在标签中显示该值

c - 如何在 Gstreamer 中修改音频流的播放速度?

使用 FFMPEG 编译的 Opencv 3.1,但不会打开 https url