要扩展现有答案:
ffmpeg 的 av_lockmgr_register 是处理锁的方式。
带有线程的 ffmpeg 构建(以及比 LIBAVCODEC_VERSION_MAJOR 55、LIBAVCODEC_VERSION_MINOR 38 和 LIBAVCODEC_VERSION_MICRO 100 更高的版本 - 大约在 2013 年 10 月左右,请参阅ffmpeg commit 添加默认 lockmgr)将具有您可以使用的默认锁管理器。
如果您需要与 libav 兼容,那么(在撰写本文时,2016 年 9 月)它还没有默认的锁管理器,您需要提供自己的。
这是一个纯 C pthread 的实现:
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;
}
这是这样注册的:
ret = av_lockmgr_register(ffmpeg_lockmgr_cb);
if (ret < 0)
{
fprintf(stderr, "av_lockmgr_register failed (%d)\n", ret);
abort();
}