gpt4 book ai didi

c++ - 围绕 avcodec_open/close 的线程锁定

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:12 24 4
gpt4 key购买 nike

我有一个 c++-cli 代码,它使用 capture 从 opencv 中的文件夹捕获视频,然后使用 cvquery frame 检索帧。然后我处理帧,一旦处理完所有帧,我就释放捕获。它工作正常但是当我尝试多线程时它给了我一个警告并且无法捕获文件夹中的一些视频并警告“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)?

最佳答案

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 .

关于c++ - 围绕 avcodec_open/close 的线程锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com