2014-06-24 2 views
0

저는 Gstreamer를 처음 사용하고 있으며 내 요소가 서로 연결되지 않는 이유에 대해 질문이 있습니다. 여기 내 코드입니다 :Gstreamer 요소가 연결되지 않았습니다.

CustomData data; 

data.videosource = gst_element_factory_make("uridecodebin", "source"); 
cout << "Created source element " << data.videosource << endl; 
data.demuxer = gst_element_factory_make("qtdemux", "demuxer"); 
cout << "Created demux element " << data.demuxer << endl; 
data.decoder = gst_element_factory_make("ffdec_h264", "video-decoder"); 
cout << "Went to the video path " << data.decoder << endl;   
data.videoconvert = gst_element_factory_make("ffmpegcolorspace", "convert"); 
cout << "Created convert element " << data.videoconvert << endl; 
data.videosink = gst_element_factory_make("autovideosink", "sink"); 
cout << "Created sink element " << data.videosink << endl; 

if (!data.videosource ||!data.demuxer || !data.decoder || !data.videoconvert || !data.videosink) 
{ 
    g_printerr ("Not all elements could be created.\n"); 
    system("PAUSE"); 
    return; 
} 

//Creating the pipeline 
data.pipeline = gst_pipeline_new("video-pipeline"); 
if (!data.pipeline) 
{ 
    g_printerr ("Pipeline could not be created."); 
} 


//Setting up the object 
g_object_set(data.videosource, "uri", videoFileName[camID] , NULL); 
//videoFileName[camID] is a char** with the content uri=file:///C://videofiles/...mp4 


//Adding elements to the pipeline 
gst_bin_add_many(GST_BIN (data.pipeline), data.videosource, data.demuxer, data.decoder, data.videoconvert, data.videosink, NULL); 
//This is where the issue occurs 
    if(!gst_element_link(data.videosource, data.demuxer)){ 
     g_printerr("Elements could not be linked. \n"); 
     system("PAUSE"); 
     return; 
} 

내가 뭘하려고하는 것은 MP4 파일을 분해 만의 비디오 콘텐츠를 표시하지만 소스와 디멀티플렉서를 연결하려고 어떤 이유로, 그것은 거짓으로 나오는 것입니다.

정말 고마워요!

답변

3

의 당신이 사용하고있는 파이프 라인을 살펴 보자 (I는 간결 여기 gst-launch를 사용합니다,하지만 같은은있는 GStreamer 파이프 라인에 간다) :

gst-launch uridecodebin uri=file:///path/to/movie.avi \ 
    ! qtdemux ! ffdec_h264 ! ffmpegcolorspace \ 
    ! autovideosink 

gst-inspect uridecodebin 상태 :
Autoplug 원시 미디어로 URI 디코드

따라서 uridecodebin은 오디오/비디오 소스를 가져 와서 일부 GStreamer의 다른 요소를 사용하여 내부적으로 디코딩합니다.
출력은 한편 video/x-raw-rgb 또는 audio/x-raw-int (원시 오디오/비디오) 같은

qtdemux 퀵타임 스트림 (여전히 인코딩 된)를 취하고이를 디 멀티플렉싱한다.

하지만 예제에서 얻은 것은 이미 디코딩 된 원본 비디오 (링크되지 않은 이유입니다)입니다. 당신의 파이프 라인이

  • 그냥 사용하는 비디오 파일을 거의 디코딩 할 수있는 uridecodebin

    를 사용

    • :

      그래서, 당신은 기본적으로 두 가지 옵션이있어 qtdemux ! ffdec_h264 ! ffmpegcolorspace 요소 :

      gst-launch filesrc=/path/to/movie.avi \ 
          ! qtdemux ! ffdec_h264 ! ffmpegcolorspace 
          ! autovideosink 
      

    파이프 라인이 오디오를 재생하지 않는다는 점에 유의하십시오.
    뿐만 아니라 다음 중 하나를 수행하는 것이 효율적으로 활용하려면 다음

    • 단순히 playbin2

      gst-launch playbin2 uri=file:///path/to/movie.avi 
      
    • 이름 = D의 URI uridecodebin 당신의 decodebin 오디오 싱크뿐만 아니라 GST-출시를 연결 사용 =. ..! autovideosink d. ! autoaudiosink
  • +0

    철저한 답변을드립니다. 나는 이것에서 많은 것을 배웠다! – user3769141

    관련 문제