要擴大現有的答案:
FFmpeg的av_lockmgr_register是對付鎖定的方式。
的ffmpeg的構建與線程(和更高版本比LIBAVCODEC_VERSION_MAJOR 55,LIBAVCODEC_VERSION_MINOR 38和LIBAVCODEC_VERSION_MICRO 100 - 大致佔2013年10月,見ffmpeg commit adding default lockmgr)將有你可以只使用一個默認的鎖管理器。
如果您需要與libav兼容(在寫作時,2016年9月),這還沒有默認鎖定管理器,您需要提供自己的。
這是一個純C並行線程的實現:
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();
}
我不能完全肯定,所以我不會做這樣的一個答案,但我認爲基本思想是庫是線程安全的,但調用者必須確保一次只有一個線程訪問單個av對象。 –