C++ 基于ffmpeg的多线程c++;应用程序解码失败

C++ 基于ffmpeg的多线程c++;应用程序解码失败,c++,multithreading,ffmpeg,C++,Multithreading,Ffmpeg,我使用来自ffmpeg源的remuxing示例作为参考。我编写了一个基于boost线程的多线程应用程序,使用ffmpeg-API执行编解码器复制和remux。那很好。当我尝试解码帧时,问题出现了 " ffmpeg api使用的所有变量都声明为线程函数的本地变量。我不确定ffmpeg帧allocs或上下文allocs是如何工作的 在使解码过程多线程化方面有什么帮助吗 更新: 我已包括ff_lockmgr static int ff_lockmgr(void **mutex, enum AVLock

我使用来自ffmpeg源的remuxing示例作为参考。我编写了一个基于boost线程的多线程应用程序,使用ffmpeg-API执行编解码器复制和remux。那很好。当我尝试解码帧时,问题出现了

"

ffmpeg api使用的所有变量都声明为线程函数的本地变量。我不确定ffmpeg帧allocs或上下文allocs是如何工作的

在使解码过程多线程化方面有什么帮助吗

更新: 我已包括ff_lockmgr

static int ff_lockmgr(void **mutex, enum AVLockOp op)
{
   pthread_mutex_t** pmutex = (pthread_mutex_t**) mutex;
   switch (op) {
   case AV_LOCK_CREATE:
      *pmutex = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t));
       pthread_mutex_init(*pmutex, NULL);
       break;
   case AV_LOCK_OBTAIN:
       pthread_mutex_lock(*pmutex);
       break;
   case AV_LOCK_RELEASE:
       pthread_mutex_unlock(*pmutex);
       break;
   case AV_LOCK_DESTROY:
       pthread_mutex_destroy(*pmutex);
       free(*pmutex);
       break;
   }
   return 0;
}
并将其初始化“
av_lockmgr_寄存器(ff_lockmgr)
现在视频正在所有线程中解码,但使用FFMPEG AVFrame到OpenCv Mat转换和imwrite从解码帧保存的图像会导致乱码(混合)帧。帧的一部分来自一个摄像头,其余部分来自另一个摄像头,或者图像根本没有任何意义。

不是每个格式解码器都支持多线程,甚至对于支持多线程的解码器,也可能不支持特定文件

例如,考虑一个MPEG4文件,在开始时用一个单一的关键帧,接着是P帧。在这种情况下,每个下一个帧都依赖于先前的,并且使用多个线程可能不产生任何好处。


在我的应用程序中,我不得不为此禁用多线程编码器。

代码中有些错误。请根据发布指南提取一个最小的示例以获得帮助(并帮助自己)。您是否建议自己设置“增强线程”并调用avcodec\u decode\u video2()在同一个AvcodeContext上同时从多个线程执行?ffmpeg多线程不是这样工作的,它不能这样工作,因为您需要调整线程锁定,以便帧间预测可以工作。让ffmpeg来处理它(它会自动执行)不要自己做任何额外的线程设置。不,我不是在打avcodec_decode_video2()在同一个AvcodeContext上。我有多个boost线程,每个线程都带有用于AV*库使用的本地化变量AvcodeContext n。这些线程之间不共享任何数据。每个线程都有单独的视频输入和单独的视频输出。我关心H264使用(libx264)我有多个线程,每个线程都有自己的编解码器上下文。它们是在同一个流上工作,还是在不同的流上工作?它们在不同的流上工作。基本上,ffmpeg源中的整个remuxing示例都将其全局变量移到了局部。线程由这些局部函数组成。因此它们不共享其中的任何变量。每个线程都使用来自不同文件的自己的输入源。这将假定x264编解码器内部是线程安全的,但情况可能并非如此。我会询问x264编解码器的作者。
   left block unavailable for requested intra mode at 0 0
[h264 @ 0x7f9a48115100] error while decoding MB 0 0, bytestream 1479
[h264 @ 0x7f9a480825e0] number of reference frames (0+2) exceeds max (1; probably corrupt input), discarding one
[h264 @ 0x7f9a480ae680] error while decoding MB 13 5, bytestream -20
[h264 @ 0x7f9a48007700] number of reference frames (0+2) exceeds max (1; probably corrupt input), discarding one
[h264 @ 0x7f9a48110340] top block unavailable for requested intra4x4 mode -1 at 31 0
[h264 @ 0x7f9a48110340] error while decoding MB 31 0, bytestream 1226
[h264 @ 0x7f9a48115100] number of reference frames (0+2) exceeds max (1; probably corrupt input), discarding one
[h264 @ 0x7f9a480825e0] top block unavailable for requested intra4x4 mode -1 at 4 0
[h264 @ 0x7f9a480825e0] error while decoding MB 4 0, bytestream 1292
[h264 @ 0x7f9a480ae680] number of reference frames (0+2) exceeds max (1; probably corrupt input), discarding one
static int ff_lockmgr(void **mutex, enum AVLockOp op)
{
   pthread_mutex_t** pmutex = (pthread_mutex_t**) mutex;
   switch (op) {
   case AV_LOCK_CREATE:
      *pmutex = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t));
       pthread_mutex_init(*pmutex, NULL);
       break;
   case AV_LOCK_OBTAIN:
       pthread_mutex_lock(*pmutex);
       break;
   case AV_LOCK_RELEASE:
       pthread_mutex_unlock(*pmutex);
       break;
   case AV_LOCK_DESTROY:
       pthread_mutex_destroy(*pmutex);
       free(*pmutex);
       break;
   }
   return 0;
}