【问题标题】:How to use ffmpeg's sws_scale from multiple threads?如何从多个线程中使用 ffmpeg 的 sws_scale?
【发布时间】:2013-04-25 23:44:18
【问题描述】:

我有一个基于sws_scale的色彩空间转换功能。它将在应用程序的生命周期内从多个不同的线程调用。但是,我不知道 sws_scale 的线程安全性如何,而且我没有发现它的文档中提到了它。

我假设每个线程都需要自己的SwsContext,因为此参数将被共享,但这足以保证不会发生任何内部冲突吗?

【问题讨论】:

    标签: c++ c ffmpeg


    【解决方案1】:

    只要每个线程都有自己的 SwsContext 值,您就应该是安全的。快速浏览一下 libswscale 源代码表明它不使用任何全局变量。

    【讨论】:

      【解决方案2】:

      ffmpeg 通常默认情况下不是线程安全的。但是,只要在单独的线程上创建每个 sws 上下文,libswsscale 似乎是安全的。

      但是,当使用 avcodec 操作时,有一个回调机制可以用来 为您的解码步骤(或其他 avcodec 相关操作)启用线程安全:

      ** 请注意,我使用这个任意 Mutex 类来进行说明:

       int ffmpeg_lock_callback(void **mutex, enum AVLockOp op)
         {
            static Mutex m;
      
            switch(op)
            {
                case AV_LOCK_CREATE:
                {
                    *mutex = &m;
                    break;
                }
                case AV_LOCK_OBTAIN:
                {
                    // TODO: Lock you mutex here
                    break;
                }
                case AV_LOCK_RELEASE:
                {
                    // TODO: Unlock your mutex here
                    break;
                }
                case AV_LOCK_DESTROY:
                {
                    *mutex = 0;
                    break;
                }
      
            }
            return 0;
        }
      

      ...

      这会出现在您的 .h 文件中:

      extern "C"{
      #include "libavcodec/avcodec.h"
      }
      
      extern "C"
      {
          int ffmpeg_lock_callback(void **mutex, enum AVLockOp op);
      }
      

      【讨论】:

      • 是的,我必须说你是对的。我的印象是这也用于创建 sws_context;但我刚刚检查了 ffmpeg 的源代码,这似乎不是真的。我会改变我的答案以反映这一点。
      • 注意:这是过时的,在较新的 ffmpeg 版本中不再需要(当编译线程感知时)。 ffmpeg_lock_callback 同时被弃用,什么也不做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多