1

我有我生命中最奇怪的错误。我已经使用自制软件安装了 ffmpeg。我从 dll 中使用它。我设置了一个锁管理器,因为我使用来自多个线程的 ffmpeg。

在 Engine.h 中:

class EXPORT_LIB Engine
{
public:
    static int initEngine();    
    static int closeEngine();
};

在 Engine.cpp 中:

static int ff_lockmgr(void **mutex, enum AVLockOp op)
{
if (NULL == mutex)
    return -1;

switch(op)
{
case AV_LOCK_CREATE:
{
    *mutex = NULL;
    boost::mutex * m = new boost::mutex();
    *mutex = static_cast<void*>(m);
    break;
}
case AV_LOCK_OBTAIN:
{
    boost::mutex * m =  static_cast<boost::mutex*>(*mutex);
    m->lock();
    break;
}
case AV_LOCK_RELEASE:
{
    boost::mutex * m = static_cast<boost::mutex*>(*mutex);
    m->unlock();
    break;
}
case AV_LOCK_DESTROY:
{
    boost::mutex * m = static_cast<boost::mutex*>(*mutex);
    delete m;
    break;
}
default:
    break;
}
return 0;
}


int Engine::initEngine()
{
    int res = -1;
    res = av_lockmgr_register(&ff_lockmgr);
    av_register_all();
    av_log_set_level(AV_LOG_QUIET); // ERROR, PANIC
    // Av lock manager success
    if( res == 0 ) {
        res = MULTITHREAD;
    }
    else {
        res = SINGLETHREAD;
    }
    return res;
}

int Engine::closeEngine()
{
    int res = 0;
    res = av_lockmgr_register(NULL);
    return res;
}

到目前为止一切顺利,一切都按预期工作。

当我使用 CMake fix_bundle 部署我的应用程序时。我有一条错误消息

avcodec_open/close() 周围的线程锁定不足

如果我在自定义位置手动编译 ffmpeg,当我部署应用程序时,一切都会按预期工作。自制软件有什么问题?

4

0 回答 0