Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FFmpeg仅在使用自制部署应用程序时线程锁定不足_C++_Dll_Deployment_Ffmpeg_Homebrew - Fatal编程技术网

C++ FFmpeg仅在使用自制部署应用程序时线程锁定不足

C++ FFmpeg仅在使用自制部署应用程序时线程锁定不足,c++,dll,deployment,ffmpeg,homebrew,C++,Dll,Deployment,Ffmpeg,Homebrew,我有我一生中最奇怪的虫子。 我已经使用自制软件安装了ffmpeg。我从dll中使用它。 我设置了锁管理器,因为我使用来自多个线程的ffmpeg 在发动机h中: class EXPORT_LIB Engine { public: static int initEngine(); static int closeEngine(); }; 在Engine.cpp中: static int ff_lockmgr(void **mutex, enum AVLockOp op) {

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

在发动机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;
}
static int ff_lockmgr(void**mutex,enum AVLockOp)
{
if(NULL==mutex)
返回-1;
开关(op)
{
案例AV_锁定_创建:
{
*互斥=空;
boost::mutex*m=新的boost::mutex();
*互斥=静态_转换(m);
打破
}
案例AVU锁定获得:
{
boost::mutex*m=静态_转换(*mutex);
m->lock();
打破
}
案例AVU锁定释放:
{
boost::mutex*m=静态_转换(*mutex);
m->unlock();
打破
}
案例AV_锁定_销毁:
{
boost::mutex*m=静态_转换(*mutex);
删除m;
打破
}
违约:
打破
}
返回0;
}
int引擎::initEngine()
{
int res=-1;
res=av_lockmgr_寄存器(&ff_lockmgr);
av_寄存器_all();
av_log_set_level(av_log_QUIET);//错误,死机
//Av锁管理器成功
如果(res==0){
res=多线程;
}
否则{
res=单线程;
}
返回res;
}
int引擎::closeEngine()
{
int res=0;
res=av_lockmgr_寄存器(空);
返回res;
}
到目前为止一切正常

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

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


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

首先,您需要确保在生成软件包时,所有库都来自正确的位置。如果锁工作不正常,则会出现您描述的错误。您可以添加一个临时日志
boost::mutex*m=newboost::mutex();如果我也尝试过pthread,那么当我使用自己的ffmpeg时,它可以工作,而不是使用自制的ffmpeg时