avcodec_encode_video2 在 MinGW32 上崩溃(但在 MinGW64 上没有)

avcodec_encode_video2 crash on MinGW32 (but not on MinGW64)

多年来我一直在测试我正在开发的软件,通过 Qt-MinGW64 只为 64 位系统编译,没有遇到任何关于视频编码的问题(这是此类应用程序的功能之一) .最近,我一直在尝试通过使用 Qt-MingGW32 编译来构建我的软件的相应 x86 版本。

但是,在构建相同的 ffmpeg 和 x264 库版本以创建 32 位版本并将它们成功链接到我的项目后,由于分段错误,应用程序在编码几帧后一直崩溃。这很奇怪,因为正如我之前指出的那样,它在为 64 位系统编译时可以完美运行。

我也浪费了相当多的时间来尝试组合大量不同版本的 ffmpeg 和 x264 库,但也没有成功。在为 x264 和 ffmpeg 库禁用线程时它都不起作用,因此它似乎不是 win32 线程问题。因此,我得出结论,错误最有可能出现在我的代码中,我无法理解,它告诉 ffmpeg 在 x64 版本中分配正确数量的内存,但在 x86 版本中却没有。

还必须指出的是,在 avcodec_encode_video2 调用之前,我进行了以下调用,其中包括分配与相应项目(AVFrame、AVCodec 等)关联的内存,比如

avcodec_open2( my_codec_context, my_codec, &opt );
my_av_frame=av_frame_alloc();

更准确地说,可以找到涉及我正在使用的代码结构的详细信息

因此,该错误似乎比关于未初始化内存的问题更微妙。

非常感谢。

更新:

我发现问题的重点了。出于某种原因,FFmpeg/x264 库在使用 Qt-MinGW32 编译的 Win32 GUI 应用程序中表现异常,而它们 运行 在同样使用 Qt-WinGW32 编译的 Win32 控制台应用程序中正确运行。我已经通过执行两个虚拟测试证明了这一说法,其中完全相同的一段代码是 运行 通过控制台应用程序和 GUI 应用程序,在第一种情况下成功而在后一种情况下失败。可以在下面找到此类测试的代码,以及我项目中使用的 x264 和 FFmpeg 库,以及使用 MinGW32 在 msys2 中构建它们的说明:

https://takeafile.com/?f=hisusinivi

我不知道它是否可以通过简单地调整代码来解决,或者它是一个涉及不兼容问题的严重错误。如果是后者,是否应该作为主要错误报告给 Qt/FFmpeg/x264 工作人员?

看起来你正在用尽内存(虚拟地址 space 可用于 32 位应用程序)至少你的 QT GUI-test 应用程序会发生这种情况。您的 YUV 4:4:4 全高清视频编码设置需要大约 1.3 GB 的内存,这应该适用于默认情况下 64 位 OS 的 32 位应用程序(并且它用于您的控制台测试)。但是由于某种原因,您的 QT GUI-test 在仅分配 1 GB 内存后开始失败。我不知道这个 1 GB 的限制是 QT 还是 Windows 对于任何 GUI 应用程序。如果您将视频分辨率设置为 960x540 而不是 1920x1080,那么它应该可以工作(因为它需要不到 1 GB 的内存)。否则,您应该通过向链接器指定 -Wl,--large-address-aware 来在 PE header 中设置 LARGE_ADDRESS_ AWARE 标志,并且 64 位 OS 上的 32 位应用程序应该可以使用超过 4 GB 的内存.

更新

看起来 QT GUI-test 的内存比控制台测试少,因为它还链接到 Qt5Guid.dll 和 Qt5Widgetsd.dll,这需要额外的 450 MB 地址 space 除了其他库也在控制台应用程序中链接,因此只有 2 GB 可用地址中的 1 GB 可用地址 space 保留在内存堆中。