2016-09-16 1 views
2

QML을 사용하는 QT 앱에 gsrtreamer 비디오를 통합하려고합니다.Qstream VideoItem에 gstreamer 싱크를 포함시키는 방법은 무엇입니까?

m_pipeline = QGst::Pipeline::create(); 
    QGst::ElementPtr udp = QGst::ElementFactory::make(QLatin1Literal("udpsrc")); 
    udp->setProperty("address", "192.168.1.1"); 
    udp->setProperty("port", 3333); 
    QGst::ElementPtr decodage = QGst::ElementFactory::make("jpegdec"); 
    QGst::ElementPtr videosink = QGst::ElementFactory::make("autovideosink"); 

equivaltent은 다음과 같습니다 udpsrc을 얻기 위해 나는 파이프 라인을 사용하려면이 예제를 수정 한

player->setUri(QLatin1Literal("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi")); 

:

나는 먼 비디오를 사용하는 예를 qmlplayer2으로 시작했습니다 받는 사람 :

gst-launch-1.0 udpsrc address=192.168.1.1 port=3333 ! jpegdec ! autovideosink 

이 방법을 사용하면 비디오가 스트리밍되고 재생/일시 정지/st op 단추 작동.

그러나 비디오는 내 QML 반면 Two separate windows

가 VideoItem가 메인 창에 있음을 지정하는 다른 창에 있습니다

Rectangle { 
    id: window 
    width: 600 
    height: 300 
    Column { 
     width: 600 
     height: 544 
     y : 10; 
     VideoItem { 
      id: video 
      y : 10; 
      width: window.width 
      height: 260 
      surface: videoSurface1 //bound on the context from main() 
     } 
     // Other buttons 

내가 찾은 모든 주제 (gstreamer를가 네이티브입니다 중 하나 너무 오래 Qt가 올해 5.5 이후) 또는 답변이 없습니다

내 작품에 실수가 있습니까?

내가 원하는 것을 할 수있는 다른 방법이 있습니까?

감사합니다.

답변

2

여기서 문제는 autovideosink가 "GstVideoOverlay"를 구현하지 않는다는 것입니다. 파이프 라인에서 "xvimagesink, ximagesink"요소 중 하나를 싱크 요소로 사용하거나 "playbin"을 직접 사용해야하며이 요소는 "GstVideoOverlay"인터페이스를 구현합니다.

"playbin"을 사용한 예입니다. 이 예제는 QT 랩퍼가없는 순수 Gstreamer를 사용합니다.

GstElement *pipeline = gst_element_factory_make("playbin", "playbin"); 
/* Set the URI to play */ 
g_object_set(pipeline, "uri", url, NULL); 
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), windowsID); 

* windowsID는 비디오 출력을 그리려는 위젯 ID입니다. * url이 귀하의 동영상 URL입니다. 당신은 "udp : //192.168.1.1 : 3333"이 될 것입니다.

관련 문제