2011-12-12 83 views
3

我正在開發一個webkit-kernel-browser插件。 大部分插件都遵守NPAPI的規則。 在調用NP_new函數後,瀏覽器應調用Npp_setwindows等。 但Chrome瀏覽器不運行此操作。 它調用Np_destory直接完成實例。 所以我無法讓瀏覽器的xid設置它的視頻鏈接。 如何解決?如何將gstreamer videosink嵌入瀏覽器

而當我使用firefox瀏覽器時,我可以得到xid。 不幸的是,當我使用gst_x_overlay_set_xwindow_id嵌入到瀏覽器。 瀏覽器崩潰。 以下是一些測試代碼。

gst_init (NULL, NULL); 

    player->pipeline = gst_element_factory_make ("playbin2", "playstation"); 
    LOGMSG("create playbin2"); 
    player->audio_sink = gst_element_factory_make ("alsasink", "audio-sink"); 
    if (NULL == player->audio_sink) 
    { 
     player->audio_sink = gst_element_factory_make ("autoaudiosink", "audio-sink"); 
     g_warning ("Could not create a GST audio_sink. Audio unavailable."); 
    } 

    player->video_sink = gst_element_factory_make ("xvimagesink", "video-sink"); 
    if (NULL == player->video_sink) 
    { 
     //pvrvideosink is used for some special solution ,but this case never used 
     player->video_sink = gst_element_factory_make ("pvrvideosink","video-sink"); 

     g_warning ("Could not create a GST video_sink. Video unavailable."); 
    } 
    g_object_set (player->video_sink, "force-aspect-ratio", TRUE, NULL); 

    sprintf(buff," \n pipleline:%p\n video:%p\n audio:%p\n uri:%s\n xid:%d", 
       player->pipeline,player->video_sink,player->audio_sink,player->uri,player->xid); 
    LOGMSG(buff);enter code here 
// log shows all the content is ok 
    g_object_set (player->pipeline, "video-sink", player->video_sink, NULL); 
    g_object_set (player->pipeline, "audio-sink", player->audio_sink, NULL); 
    g_object_set (player->pipeline, "uri",player->uri, NULL); 

    player->bus = gst_element_get_bus (GST_ELEMENT (player->pipeline)); 
    gst_bus_add_watch(player->bus,(void *)process_events,player); 

    LOGMSG("start set winid"); 
/* 
chrome can not get the browser xid ,so it display the image in fullscreen way with the player 's own window. The firefox can not display the image at all. It crashed here. 
*/ 
    if (player->xid != 0) 
    { 
     gst_x_overlay_prepare_xwindow_id(GST_X_OVERLAY(GST_ELEMENT(player->video_sink))); 
     gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_ELEMENT(player->video_sink)),player->xid); 

     gboolean spt = gst_x_overlay_set_render_rectangle 
         (GST_X_OVERLAY(GST_ELEMENT(player->video_sink)),10,10,480,270); 
     if (!spt) 
     { 
      LOGMSG("not support the rectangle"); 
     } 
     gst_x_overlay_expose(GST_X_OVERLAY(GST_ELEMENT(player->video_sink))); 

    } 

    LOGMSG("set xwinid finished"); 
    gst_element_set_state(player->pipeline,GST_STATE_PLAYING); 

    loop = g_main_loop_new (NULL, FALSE); 
    LOGMSG("start player loop"); 
    g_main_loop_run (loop); 

誰能給我關於這些的一些信息?

最好的問候, 森林

+1

從您的應用程序註釋掉videosink和相關的代碼,你能聽到聲音? – karlphillip

+1

原因我使用「playbin2」,我認爲很難評論videsink代碼。但如果我不使用gst_x_overlay_set_xwindow_id將playarea嵌入到瀏覽器中,該插件可以構建自己的窗口並運行良好。 – user1089198

+1

上週有人向gstreamer-devel郵件列表發送了一封電子郵件,表示有新版本可用。也許值得將你的版本更新到最新版本。 – karlphillip

回答