线程锁定avcodec_open/close

fmv*_*ior 5 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);
}
Run Code Online (Sandbox Code Playgroud)

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

while(!capture) 
    capture=cvCreateFileCapture(filename);
Run Code Online (Sandbox Code Playgroud)

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

Mig*_*uel 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();
}
Run Code Online (Sandbox Code Playgroud)

有许多Mutex实现.在Linux或OS X上,您可以使用pthread互斥锁.在Windows上,您可以使用Win32互斥锁.