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

标签 c++ multithreading ffmpeg

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

 ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &pkt);
            if (ret < 0) {
                av_log(NULL, AV_LOG_ERROR, "Error decoding video %s\n",av_make_error_string(errorBuff,80,ret));
                return -1;
            }"

我需要解码帧将其转换为 Opencv Mat 对象。对于单个实例,此代码工作正常。但是,一旦我运行多个线程,我就会开始出现像这样的解码错误

   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

ffmpeg api 使用的所有变量都声明为线程函数的局部变量。我不确定 ffmpeg 帧分配或上下文分配如何工作。

对多线程解码过程有什么帮助吗?

更新: 我已经包含了 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_register(ff_lockmgr);" 现在视频正在所有线程中解码,但使用 FFMPEG AVFrame 到 OpenCv Mat 转换和 imwrite 从解码帧保存的图像导致乱码(混合)帧。部分画面来自一台相机,其余部分来自另一台相机,否则图像根本没有任何意义。

最佳答案

并非所有格式解码器都支持多线程,即使支持多线程的解码器也可能不支持特定文件。

例如,考虑一个 MPEG4 文件,开头有一个关键帧,后面是 P 帧。在这种情况下,每个下一帧都依赖于前一帧,使用多线程可能不会产生任何好处。

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

关于c++ - 基于 ffmpeg 的多线程 C++ 应用程序解码失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34940487/

相关文章:

c++ - 互斥锁是否会锁定自身,或者有问题的内存位置?

java - JAVA中的多线程概念

带有 RTMP 模块 : Add watermark on MULTIPLE video streams withh ffmpeg 的 nginx.conf

c++ - 使用 std::vector 作为 std::map 的键在未找到和使用 reserve() 时不返回 end()

c++ - V8 "Hello World"示例 - 在 Ubuntu 13.10 上编译 - 大量 undefined reference 错误 "icu_46"

c++ - OpenGL-添加第二个着色器属性会导致黑屏

c# - 如何在 C# 中将数组放入结构中?

python - 调用 app.MainLoop() 后更新 wxPython 进度条

bash - ffmpeg 将音频混合代码组合成复杂的连接脚本

android - 如何在 Android 中通过 FFmpeg 解码音频