2016-06-01 4 views
0

avdec_h264와 avenc_mpeg4의 두 요소를 연결하는 데 문제가 있습니다. 어떻게 든 이들 요소는 데이터의 기능을 협상 할 수 없다고 생각합니다.GStreamer : Caps 협상 실패

나는 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; 
    } 

모든 링크 : I 파이프 라인이 구현 내 응용 프로그램을 사용

. 모든 요소는 상태를 PLAYING으로 변경하지만 아무 것도 얻을 수 없습니다. 파이프 라인의 버스에서 GST_MESSAGE_STREAM_START을 (를) 얻지 못합니다.

여기 GST 발사 내 응용 프로그램에서 그래프이다 Graph generated by gst-launch Graph generated by my application

내가 잘 작동 의지, videoconvert의 인코더 아닌 요소, 모든 것에 avenc_mpeg4 변경하는 경우. 다른 인코더를 설치하면 여전히 문제가 발생합니다.

아마도 엔코더 작업 방법에 대한 특정 사항을 알지 못합니다. 하지만 해결책을 찾지 못했습니다.

감사합니다.

답변

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를 읽음으로써 속임수를 썼지 만 그것은 단지 depayloader이므로 실제로 작동 할 것이다 (1 부)). – ensonic

+0

죄송합니다, demux 그냥 depayloader입니다. 이 작업을하므로 점 1 무시하십시오. 협상을 위해 아마도 디버그 로그를 확인해야합니다. / – ensonic

0

여기서 수신자를 demuxer에 연결 하시겠습니까? 그건 내가 알기에 필요한거야.