2016-06-01 12 views
0

avdec_h264とavenc_mpeg4という2つの要素のリンクに問題があります。どういうわけか、これらの要素がデータの機能をネゴシエートできないと私は思います。GStreamer:キャップネゴシエーションの失敗

Iは、GST-打ち上げと私のパイプラインをテストしてみた:

gst-launch-1.0 rtspsrc location="rtsp://camera" ! rtph264depay ! h264parse ! avdec_h264 ! avenc_mpeg4 ! fakesink 

それがうまく働いています。成功し

pipeline_ = gst_pipeline_new("default"); 

    if (!pipeline_) 
    { 
     return false; 
    } 

    receiver_ = gst_element_factory_make("rtspsrc",  "receiver"); 
    demuxer_ = gst_element_factory_make("rtph264depay", "demuxer"); 
    parser_ = gst_element_factory_make("h264parse", "parser"); 
    decoder_ = gst_element_factory_make("avdec_h264", "decoder"); 
    encoder_ = gst_element_factory_make("avenc_mpeg4, "encoder"); 
    output_ = gst_element_factory_make("fakesink",  "output"); 

    if (!receiver_ || !demuxer_ || !parser_ || 
     !decoder_ || !encoder_ || !output_) 
    { 
     return false; 
    } 

    g_object_set(GST_OBJECT(receiver_), "location", "rtsp://camera", nullptr); 
    // On this signal source pad of the receiver is being connected to 
    // the sink pad of the demuxer. 
    g_signal_connect(receiver_, "pad-added", G_CALLBACK(on_pad_added), this); 

    gst_bin_add_many(GST_BIN(pipeline_), receiver_, demuxer_, parser_, 
        decoder_, encoder_, output, nullptr); 

    if (!gst_element_link_many(demuxer_, parser_, decoder_, 
           encoder_, output_, nullptr)) 
    { 
     return false; 
    } 

すべてのリンク:私はパイプラインが実装されている自分のアプリケーションを使用し

。すべての要素は状態をPLAYINGに変更しますが、何も得られません。パイプラインのバスでGST_MESSAGE_STREAM_STARTを取得しません。私はエンコーダではありませんvideoconvert要素、にavenc_mpeg4変更すると、うまく機能がある場合、すべて Graph generated by gst-launch Graph generated by my application

:ここ

は、GST-打ち上げと私のアプリケーションからのグラフです。私は他のエンコーダを置く場合、私はまだ現在の問題があります。

おそらく、私はエンコーダの操作方法についていくつかのことについてはわかりません。しかし、私は解決策を見つけることができませんでした。

ありがとうございます。

答えて

0

いくつかのポイント:

  1. あなたは上記の投稿のコードはdecodebinのパッド追加されたメッセージにリストされている必要があります。コードがそのまま動作するのであれば、私は驚いています(おそらく、ここから要点とリンクに完全なコードを入れてください)。 https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html
  2. デコーダとエンコーダの間にビデオコンバートを挿入します。
+0

私は要点を作成しました:https://gist.github.com/simonenkos/9e31fc66b38a09afea362f1180c8296d 私はvideoconvert要素を追加しようとしましたが、何も変わりません。 また、私はデコードビンについても理解していません。私は私のパイプラインにそのような要素を持っていません。私は時々ソースパッドを持っているrtspsrc用の「パッド付きの」シグナルハンドラだけを持っています。 –

+0

私はdemuxerを読んで騙されましたが、これはデパイローダですので、実際には動作します(パート1))。 – ensonic

+0

申し訳ありませんが、demuxはデパイローダです。これは機能しますので、ポイント1を無視してください。交渉のためには、デバッグログをチェックする必要があります:/ – ensonic

0

ここで、受信者をdemuxerにリンクしていますか?それは私が理解するように必要です。