【问题标题】:QT ffmpeg SettingQT ffmpeg 设置
【发布时间】:2016-07-20 21:34:21
【问题描述】:

我不能在 QT 中使用 ffmpeg。

我的步骤:

-1。正常编译ffmpeg

-2。在 QT .pro 中添加 lib/include 路径

LIBS += -L/home/kim/ffmpeg/lib -lavcodec -lavformat
INCLUDEPATH += /home/kim/ffmpeg/include

-3。在代码中

extern "C" { 
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}

只需调用一个名为 av_register_all() 的函数;

然后我得到了以下 bulid 问题

in function `rl2_read_packet`: undefined reference to `av_free_packet`
in function `av_register_all`: ....

我搜索了solution 的问题,但对我不起作用。

还有其他解决方案吗?谢谢。

【问题讨论】:

    标签: qt ffmpeg


    【解决方案1】:

    这是一个旧帖子,几乎解决了。顺便说一句,我遇到了这个问题,我花了很多时间来解决这个问题

    undefined reference to av_register_all
    

    我使用的是 Qt Creator 5.3.2,这是我的 MYPROJECT.pro 文件

    MYPROJECT.pro

    QT       += core
    QT       -= gui
    TARGET = MYPROJECT
    CONFIG   += console
    CONFIG   -= app_bundle
    TEMPLATE = app
    SOURCES += main.cpp
    QMAKE_CXXFLAGS += -D__STDC_CONSTANT_MACROS
    LIBS += -LC:\ffmpeg-20151219-git-2dba040-win32-dev\lib
    LIBS += -lavcodec -lavformat -lavutil -lswscale
    INCLUDEPATH +=C:\ffmpeg-20151219-git-2dba040-win32-dev\include
    
    • 设置 project.pro

    建议从头开始构建 ffmpeg,但如果你是在 windows 上,如果你不愿意编译这个杰作,那么恭喜!你和我一样!去预建 zereanoe 并下载最新的共享和开发 win-32 版本。将后两个包解压到路径中没有空格的地方,即我的在:C:\ffmpeg-20151219-git-2dba040-win32-dev 我建议不要重命名主文件夹,因为它信息量很大。通过以下代码行将 [PATH TO ffmpg-YYYYMMDD-git-win32-dev]/include 的 include 文件夹设置为你项目的搜索空间:

    INCLUDEPATH +=C:\ffmpeg-20151219-git-2dba040-win32-dev\include
    

    您还应该将 [PATH TO ffmpeg-YYYYMMDD-git-win32-dev]/lib 中的库用于您的项目,如下所示:

    LIBS += -LC:\ffmpeg-20151219-git-2dba040-win32-dev\lib
        LIBS += -lavcodec -lavformat -lavutil
    

    您可以调用 lavcodec、lavformat 和 lavutil 以外的库。在您的 cpp 文件中,您应该将与 ffmpeg 对应的标头包含在 extern "C" 块中。

    • 应添加 DLL

    最后一步是将所有的dll文件添加到你最近下载的ffmpeg的共享版本中。 复制 *.dll 内的文件

    [PATH TO ffmpeg-YYYYMMDD-git-2dba040-win32-shared]/bin
    

    并将它们粘贴到您的可执行文件所在的任何位置。例如,我的项目位于 C:/QtProjects/MYPROJECT,那么我的二进制文件位于:

    C:/QtProjects/build-MYPROJECT-Desktop_Qt_5_3_MinGW_32bit-Debug
    

    现在,将所有 dll 复制到项目的调试或发布文件夹中。

    • 我的 main.cpp 这是我的 main.cpp:

    main.cpp

    #include <iostream>
    
    extern "C" {
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    #include <libswscale/swscale.h>
    
    }
    using namespace std;
    int main(int argc, char *argv[])
    {
        cout<<"I have included FFMPEG in my project"<<endl;
        av_register_all();
        cout<<"If everything goes well you will see ME"<<endl;
        return 0;
    }
    

    【讨论】:

    • 即使完成所有这些步骤后,我仍然无法让 ffmpeg 在 QT 中工作。即使 dll 与可执行文件位于同一目录中,我的程序也能正常运行,然后意外完成。 stackoverflow.com/questions/35278460/…
    • 我阅读了您的问题,我认为将外部 dll 添加到您的 .pro 时出现了问题。而是针对文件的物理地址 (LIBS+=MY_PATH/libavformat.dll) 使用这种格式 LIBS +=MY_PATH -lavcodec -lavformat -lavutil。此外,您是否尝试过 mingw 编译器而不是 msvc ?
    • 我在我的 pro 中添加了 lib 而不是 dll 文件(出于沮丧,我尝试了另一种方法)。 dll 已与可执行文件放在同一目录中。我对 dll 的理解是,由于它们在运行时链接,它们需要位于可查找的位置(例如可执行文件所在的位置或 system32),因此不需要包含在 pro 中。 (如果我的理解不正确,那可能是我的问题,因为我遇到的错误类型通常与找不到 dll 相关联)。切换编译器是一个不受欢迎的解决方案,因为它可能会在我的代码库的其他地方引起问题。
    • @Burn-Man,您关于 DLL 的声明是正确的,编译时不需要包含它们,但是,编译时需要 STATIC 库。 LIBS+= PATH -lavformat 例如,添加静态库,比如 dll.a 文件。
    • 嗯,你对它与 MinGW 的合作是对的。现在我必须看看使用 MSVC 构建 ffmpeg 或者看看切换到 MinGW 对我们的代码有多么糟糕。
    【解决方案2】:

    我遇到了同样的问题,它使用了以下技巧。

    在代码cpp源码中:

    #define __STDC_CONSTANT_MACROS
    
    extern "C" {
    #include "libavcodec/avcodec.h"
    #include "libavformat/avformat.h"
    }
    

    在您的 .pro 文件中:

    LIBS += -LC:/Users/tom/bla/ffmpeg/lib/ -lavcodec -lavformat -lavutil
    

    我认为在您的情况下,您需要 -lavutil lib 参数。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      相关资源
      最近更新 更多