0

我正在尝试使用从网络流中读取帧libvlc,然后使用opencv. 这是我用来检索帧的代码:

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;
}

问题是这在调试模式下工作正常,但是当我切换到发布模式时,它说:

无法在动态链接库 libvlc.dll 中找到过程入口点 cvCreateImage。

我也尝试更改链接器优化标志,但问题仍然存在。

4

2 回答 2

0

我刚刚遇到了类似的过剩问题(我的应用程序试图在 libVLC.dll 中找到一个过剩过程)。

虽然我不知道是什么导致了这个问题,但我能够通过以下方式解决它:

我没有使用 VLC 附带的 .lib 文件,而是按照这些步骤来了解如何从 dll 文件生成 lib

使用这个库为我解决了这个问题,即使我不知道它为什么会首先发生。

于 2013-01-29T04:51:14.997 回答
0

我似乎已经修复了它。在另一篇关于 VS 2008 编译问题的文章中(在调试中一切正常。在发布模式下切换并构建所有内容,它就在线崩溃了)。我注意到他们一直在从to调整/OPT链接器标志,这似乎解决了他们遇到的另一个问题。/OPT:REF/OPT:NOREF

  1. 打开项目的属性页对话框。有关详细信息,请参阅设置 > Visual C++ 项目属性。
  2. 选择链接器文件夹。
  3. 选择命令行属性页。
  4. 在附加选项中输入选项:/OPT:NOREF

微软文档:

参考 | NOREF /OPT:REF 消除从未引用的函数和/或数据,而 > /OPT:NOREF 保留从未引用的函数和/或数据。

LINK默认情况下删除未引用的打包函数。如果对象已使用该/Gy选项编译,则它包含打包函数 (COMDAT)。这种优化称为传递 COMDAT 消除。要覆盖此默认值并在程序中保留未引用的 COMDAT,请指定/OPT:NOREF. 您可以使用该/INCLUDE选项覆盖特定符号的删除。

于 2015-06-01T11:41:39.400 回答