首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibAv/FFMpeg的线程安全?

LibAv/FFMpeg的线程安全?
EN

Stack Overflow用户
提问于 2012-12-15 11:01:03
回答 2查看 5.9K关注 0票数 6

LibAV/FFMpeg线程安全吗?例如。我可以在一个线程中使用AVFormatContext*从一个文件中读取,然后在另一个线程中通过简单的互斥锁来解码读取的数据包吗?或者库的线程安全性是一个“不知道不关心”的类型吗?我知道libav对编码器线程有基本的支持,但我尝试了更多的黑盒类型的方法,我将它分解为多个线程(源->解码器、->过滤器、->编码器、->接收器),并试图理解这些线程的复杂性。

任何与ffmpeg和线程有任何经验的人,并希望与此相关的任何其他信息,也将非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-16 06:08:07

你可以注册你自己的锁管理器。ffmpeg库将控制线程安全。

示例:

代码语言:javascript
复制
 ::av_lockmgr_register(&my_lockmgr_cb);


 //// ..........

 int my_lockmgr_cb(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;

}

票数 8
EN

Stack Overflow用户

发布于 2016-09-30 15:58:25

在现有答案的基础上进行扩展:

ffmpeg的av_lockmgr_register是处理锁定的方法。

带有线程的LIBAVCODEC_VERSION_MICRO构建(以及比LIBAVCODEC_VERSION_MAJOR 55、LIBAVCODEC_VERSION_MINOR 38和LIBAVCODEC_VERSION_MICRO 100更高的版本-大约在2013年10月,请参阅ffmpeg commit adding default lockmgr)将有一个默认的锁管理器,您可以直接使用它。

如果您需要兼容libav,那么(在撰写本文时,2016年9月),libav还没有默认的锁管理器,您需要提供自己的锁管理器。

下面是一个纯C pthread的实现:

代码语言:javascript
复制
static int ffmpeg_lockmgr_cb(void **arg, enum AVLockOp op)
{
    pthread_mutex_t *mutex = *arg;
    int err;

    switch (op) {
    case AV_LOCK_CREATE:
        mutex = malloc(sizeof(*mutex));
        if (!mutex)
            return AVERROR(ENOMEM);
        if ((err = pthread_mutex_init(mutex, NULL))) {
            free(mutex);
            return AVERROR(err);
        }
        *arg = mutex;
        return 0;
    case AV_LOCK_OBTAIN:
        if ((err = pthread_mutex_lock(mutex)))
            return AVERROR(err);

        return 0;
    case AV_LOCK_RELEASE:
        if ((err = pthread_mutex_unlock(mutex)))
            return AVERROR(err);

        return 0;
    case AV_LOCK_DESTROY:
        if (mutex)
            pthread_mutex_destroy(mutex);
        free(mutex);
        *arg = NULL;
        return 0;
    }
    return 1;
}

它是这样注册的:

代码语言:javascript
复制
ret = av_lockmgr_register(ffmpeg_lockmgr_cb);
if (ret < 0)
{
    fprintf(stderr, "av_lockmgr_register failed (%d)\n", ret);
    abort();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13888915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档