2012-12-31 36 views
0

我試圖使用libvlc從網絡流中讀取幀,然後使用opencv對這些幀應用一些處理。這是我使用的檢索幀代碼:opencv和libvlc不能在釋放模式下一起工作

struct ctx 
{ 
    IplImage* image; 
    HANDLE mutex; 
    uchar* pixels; 
}; 

void *lock(void *data, void**p_pixels) 
{ 
    struct ctx *ctx = (struct ctx*)data; 
    WaitForSingleObject(ctx->mutex, INFINITE); 
    *p_pixels = ctx->pixels; 
    return NULL; 

} 
void display(void *data, void *id) 
{ 
    (void) data; 
    assert(id == NULL); 
} 
void unlock(void *data, void *id, void *const *p_pixels){ 
    struct ctx *ctx = (struct ctx*)data; 
    // VLC just rendered the video, but we can also render stuff 
    uchar *pixels = (uchar*)*p_pixels; 
    cvShowImage("image", ctx->image); 
    ReleaseMutex(ctx->mutex); 
    assert(id == NULL); // picture identifier, not needed here 
} 

int main() 
{ 
    cvNamedWindow("image", CV_WINDOW_AUTOSIZE); 
    libvlc_media_t* media = NULL; 
    libvlc_media_player_t* mediaPlayer = NULL; 
    //char const* vlc_argv[] = {"--plugin-path", "C:\\Users\\Oscar\\Documents\\libvlc\\vlc-1.1.4"}; 
    libvlc_instance_t* instance = libvlc_new(0,NULL); 
    mediaPlayer = libvlc_media_player_new(instance); 
    media = libvlc_media_new_location(instance, "rtsp://134.202.84.79:554/user=a&password=abcdef&channel=6&stream=0.sdp/"); 

    struct ctx* context = (struct ctx*)malloc(sizeof(*context)); 
    context->mutex = CreateMutex(NULL, FALSE,NULL); 
    //context->image = cvCreateImage(cvSize(libvlc_video_get_height(mediaPlayer), libvlc_video_get_width(mediaPlayer)), IPL_DEPTH_8U, 4); 

    context->image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 4); 
    context->pixels = (unsigned char *)context->image->imageData; 

    libvlc_media_player_set_media(mediaPlayer, media); 
    libvlc_video_set_callbacks(mediaPlayer, lock, unlock, display, context); 
    libvlc_video_set_format(mediaPlayer, "RV32", 640, 480, 640*4); 
    libvlc_media_player_play(mediaPlayer); 


    while(true) 
    { 
     if (waitKey(30)==27) 
     { 
      break; 
     } 
    } 
    return 0; 
} 

的問題是,這個在調試模式下工作時,工作正常,但當我切換到發佈模式,它說:

程序入口點cvCreateImage不能位於動態鏈接庫libvlc.dll中。

我也嘗試更改鏈接器優化標誌,但問題仍然存在。

回答

0

我也有類似的問題,過剩(我的應用程序試圖找到libVLC.dll過剩過程)。

雖然我不知道是什麼原因導致這個問題,我能解決它以下列方式:

,而不是使用與VLC附帶的.lib文件,我也跟着these steps on how to generate a lib from a dll file

使用此lib中解決了這個問題對我來說,雖然我不知道爲什麼會發生在首位。

0

我似乎已經固定它。在另一篇關於VS 2008編譯問題的文章中(調試一切都很好,在Release模式下切換並構建所有內容,並且崩潰了)。 我注意到,他們已經從/OPT:REF調整/OPT鏈接器標誌/OPT:NOREF和它似乎解決不同的問題,他們有。

  1. 打開項目的屬性頁對話框。有關詳細信息,請參閱 設置> Visual C++項目屬性。
  2. 選擇鏈接器文件夾。
  3. 選擇命令行屬性頁面。
  4. 在其他選項中輸入選項:/OPT:NOREF

微軟文檔:

REF | NOREF /OPT:REF消除了在/> OPT時從不會引用的函數和/或數據:NOREF保留從未引用的函數和/或數據。

LINK默認情況下刪除未引用的打包函數。如果已使用/Gy選項編譯了對象,則該對象包含打包函數(COMDAT)。這種優化稱爲傳遞式COMDAT消除。要覆蓋此默認值並在程序中保留未引用的COMDAT,請指定/OPT:NOREF。您可以使用/INCLUDE選項來覆蓋刪除特定符號。

+0

或者你可以只使用正確的產生libvlc.lib:https://code.google.com/p/vc-libvlc/downloads/list – RSATom

相關問題