2016-12-21 12 views
1

h264로 인코딩 된 비디오를 재생하려고 시도했으나 matroskamux로 다중화 된 비디오를 재생하려했지만이를 수행 할 수 없습니다. 나는 임베디드 플랫폼, iMX6에있다.Gstreamer : mastroskamux 오류 : 연결되지 않았습니다.

gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink 

내가 C에서 만든,하지만 작동하지 않습니다

내 파이프 라인은 GST-미사일 작동합니다. I i가 모든 요소를 ​​포함하는 구조를 사용 rep, 오류 처리를 제거 :

rep->pipeline = gst_pipeline_new("pipeline"); 
rep->src = gst_element_factory_make("filesrc","source0"); 
rep->demux = gst_element_factory_make("matroskademux","demux0"); 
rep->queue = gst_element_factory_make("queue2","queue0"); 
rep->parser = gst_element_factory_make("h264parse","parser0"); 
rep->decoder = gst_element_factory_make("imxvpudec","dec0"); 
rep->sink = gst_element_factory_make("imxipuvideosink","sink0"); 
gst_bin_add_many (GST_BIN(rep->pipeline), rep->src, rep->demux, rep->queue, rep->parser, rep->decoder,rep->sink, NULL); 
g_object_set(rep->src, "location", "video.mkv", NULL); 
g_object_set(rep->sink, "use-vsync", TRUE, NULL); 
gst_element_link_many(rep->src, rep->demux, rep->queue, rep->parser, rep->decoder, rep->sink, NULL); 
g_print("start pipeline\n"); 
gst_element_set_state (rep->pipeline, GST_STATE_PLAYING); 
g_main_loop_run (loop); 

동영상이 표시되지 않고 애플리케이션 붙어있다. GST_DEBUG = 4로 나는 디버그를 많이 얻을 수 있지만, 마지막 라인 : 그것이 "때때로"소스 패드를 가지고 있기 때문에

0:00:00.168590667 577 0xe24c0 WARN   matroskademux matroska-demux.c:4500:gst_matroska_demux_loop:<demux0> error: stream stopped, reason not-linked 
0:00:00.168777333 577 0xe24c0 INFO  GST_ERROR_SYSTEM gstelement.c:1835:gst_element_message_full:<demux0> posting message: GStreamer encountered a general stream error. 
0:00:00.169084667 577 0xe24c0 INFO  GST_ERROR_SYSTEM gstelement.c:1858:gst_element_message_full:<demux0> posted error message: GStreamer encountered a general stream error. 
0:00:00.169268000 577 0xe24c0 INFO     task gsttask.c:300:gst_task_func:<demux0:sink> Task going to paused 

나는, 디멀티플렉서의 패드의 연결을 강제로 시도했다.

어떻게 작동하게 할 것인지 잘 모릅니다. 도움 주셔서 감사합니다.

편집 : 로그 파일 here. 링크 문제입니다. 해결 방법을 모르겠습니다.

+0

아마도 대문자가 일치하지 않습니다. 아마 matroska에 트랙이 더 있을까요? GST_DEBUG = 5를 시도하고 로그를 파일로 리디렉션하십시오. 무슨 일이 일어나는지 설명 할 수있는 많은 것들이 있습니다. 로그를 살펴볼 수 있습니다. – peper0

+0

@ peper0 답변을 주셔서 감사 드리며, 로그로 내 게시물을 편집했습니다. – PierreOlivier

+0

기록한 실행 중에 파이프 라인이 정확히 무엇입니까? [편집] 죄송합니다, 나는 그것이 gst - 발사에서 로그라고 생각. 이제 당신이 첨부 한 코드에서 볼 수 있습니다. – peper0

답변

2

문제는 링크를 시도 할 때 demux에 NULL 상태의 소스 패드가 없다는 것입니다. Demux는 PAUSED 상태의 출력 패드를 추가합니다.이 시점에서 입력 파일 처리가 시작되기 때문입니다. 따라서 처음에는 링크를 연결 한 다음 시작할 수 없습니다.

당신은 "에 패드 부가"같은 것을 함께 디멀티플렉서의의 이벤트에 연결해야합니다

g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue); 

그리고 쓰기 적절한 on_pad_added 기능이 같은 :

void 
on_pad_added (GstElement *element, 
       GstPad  *pad, 
       gpointer data) 
{ 
    GstPad *sinkpad; 
    GstElement *queue = (GstElement *) data; 

    g_print ("Dynamic pad created, linking demuxer/decoder\n"); 

    sinkpad = gst_element_get_static_pad (queue, "sink"); 

    gst_pad_link (pad, sinkpad); 

    gst_object_unref (sinkpad); 
} 

가 I didn를 내 코드가 컴파일되는지 확인하지 말고 아이디어를 잡을 것입니다.

this example에 관심이있을 수 있습니다.

현재 gst-launch는 지연 연결을 지원하는 일부 스마트 기계를 사용합니다. 코드에서 수동으로해야합니다.

+0

정말 고마워! – PierreOlivier