代码之家  ›  专栏  ›  技术社区  ›  bjoernz

如何在Qt4中使用libavcodec?

  •  3
  • bjoernz  · 技术社区  · 14 年前

    如何在Qt4中使用libavcodec访问单个视频帧?

    在验证libavcodec可以通过编译对视频流进行解码之后 this example 我把源代码移到我的C++程序中。现在 av_open_input_file() 突然无法打开我的视频文件(返回错误代码:-2)。

    电话现在是这样的:

    ...
    // Register all formats and codecs
    avcodec_register_all();
    
    // Open video file
    QString videoFileName("/absolute/path/to/video.avi"); // from somewhere else in the application
    const char* fileName = videoFileName.toStdString().c_str();
    int err = 0;
    if((err = av_open_input_file(&pFormatCtx, fileName, NULL, 0, NULL)) != 0)
    {
        doErrorHandling(err, fileName); // err = -2
    }
    

    当我看着 const char* fileName 在调试器中它看起来是正确的。我在混合C和C++代码时犯了一些基本错误(第一次尝试时,我只是把代码从一个例子中倾倒到一个类的构造器中)?

    注意 :为了让应用程序编译,我包含了如下标题:

    extern "C"
    {
    #define __STDC_CONSTANT_MACROS // for UINT64_C
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    #include <libswscale/swscale.h>
    }
    

    我还尝试将视频文件的路径硬编码到应用程序中,但没有成功:

    av_open_input_file(&pFormatCtx, "/home/bjoernz/video.avi", NULL, 0, NULL);
    

    我能够使用 g++ .

    2 回复  |  直到 14 年前
        1
  •  2
  •   yonilevy    14 年前

    错误-2表示 No such file or directory . 我很确定在运行应用程序时,您试图打开的文件不在您的“当前工作目录”中。

        2
  •  2
  •   bjoernz    14 年前

    好吧,这很尴尬:

    当我将源代码从示例转移到c++应用程序时,当我遇到链接器错误时犯了一个愚蠢的错误,这告诉我 av_register_all(); 不可用。。。我把它改名为 avcodec_register_all() ,过了一会儿,我解决了链接器的问题,却忘了。。。

    解决方案 : avcodec_register_all() 需要改成 av_register_all() .