线程锁定avcodec_open / close

时间:2012-08-17 19:12:50

标签: c++ opencv c++-cli

我有一个c ++ - cli代码,它使用捕获从opencv文件夹中捕获视频,然后使用cvquery框架检索帧。然后我处理帧,一旦处理完所有帧,我就会释放捕获。它工作正常,但当我尝试多线程时,它给了我一个警告,无法捕获文件夹中的一些视频,警告“avcodec_open / close()周围的线程锁定不足”。

//for each video in folder do
{
    capture=cvCreateFileCapture(filename);

    while(1)
    {
        img=cvqueryframe(capture) 

        if !img break;
        ///process img
    }

    cvreleasecapture(&capture);
}

有没有办法解决多线程的问题?我在考虑使用

while(!capture) 
    capture=cvCreateFileCapture(filename);

但应该有一种更有效的方法,可能使用锁定Monitor :: Enter(obj)或lock(obj)?

1 个答案:

答案 0 :(得分:10)

avcodec中的openclose函数不是线程安全的。为了防止多线程应用程序中出现问题,他们有一个简单的机制,可以检测两个线程何时同时进入这些函数,并在发生这种情况时编写“线程锁定不足”消息。

阻止此邮件的方法是锁定对cvCreateFileCapturecvreleasecapture(进而调用avcodec_openavcodec_close)的来电,以确保这些来电始终序列化。例如,如果你有一个名为Mutex的互斥类,你可以这样做:

extern Mutex m; // application-wide mutex

//for each video in folder do
{
    m.lock();
    capture=cvCreateFileCapture(filename);
    m.unlock();

    while(1)
    {
        img=cvqueryframe(capture) 

        if !img break;
        ///process img
    }

    m.lock();
    cvreleasecapture(&capture);
    m.unlock();
}

有许多Mutex实现。在Linux或OS X上,您可以使用pthread mutexes。在Windows上,您可以使用Win32 mutexes