.NETソフトウェア用のメディアプレーヤーコンポーネントを作成する目的で、gStreamer-Sharpを試してみました。私たちはLinux/Monoではなく、Windows/.NET上で動作しています。gStreamer-Sharp - パイプラインがリンクに失敗する
いくつかのパイプラインは問題なく作成、リンク、実行できますが、それ以外は失敗します。そこにはドキュメンテーションとサポートが不足しているので、この分野の知識を持っている人が私の質問に追い込まれ、私にいくつかのヒントを与えてくれるはずです。
とにかく、それ以上の騒ぎをせずに、私は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のログをどのように切り替えるか、または可能であるかどうかはわかりません。誰かがここで私を助けることができるなら、私は本当にそれを感謝します。
ありがとうございました。