2.FFmpeg4.3 SDL2 Qt5开发环境的搭建


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

2.FFmpeg4.3+SDL2+Qt5开发环境的搭建

image.png

搭建环境Qt5+FFmpeg4.3

QT + FFMPEG4.3 开发环境搭建

步骤简要

三部曲:

1.头文件、

2.库文件

3.运行时dll/so


step1: 下载FFmpeg相应的动态库文件和程序执行所依赖的.dll文件。

step2: 将动态库所对应的头文件和动态库文件加入工程

step 3: 将dll文件copy到.exe文件所对应的目录下。


注意:

官方编译好的下载地址已经无法打开,

我将ffmepg4.3.1(32位)的开发包和源码上传到了百度云:

链接:https://pan.baidu.com/s/1-3xSO6ytyQLlSId0Xiak4w 

提取码:fyxy


敬告:如需要64位的开发包,请自己编译

 

下载FFMpeg对应的动态库和DLL文件


1 下载地址:(FFmpeg4.3.1)

开发环境为win10 64bit +QT5.9.8 ,需下载window 32 bit对应的shared文件(包含dll文件)和Dev文件(包含动态库和include的文件以及examples)。

注意window-64bit的开发库时,提示 “xxx undefined  reference ”。.


step 2 :将动态库和头文件加入project

将下载的dev文件解压,文件名改为ffmpeglib,并copy到工程所在的目录


一)加入头文件

INCLUDEPATH += $$PWD/ffmpeg/include


二)加入动态库文件

LIBS    += $$PWD/ffmpeg/lib/avcodec.lib \

            $$PWD/ffmpeg/lib/avdevice.lib \

            $$PWD/ffmpeg/lib/avfilter.lib \

            $$PWD/ffmpeg/lib/avformat.lib \

            $$PWD/ffmpeg/lib/avutil.lib \

            $$PWD/ffmpeg/lib/postproc.lib \

            $$PWD/ffmpeg/lib/swresample.lib \

            $$PWD/ffmpeg/lib/swscale.lib 


--->ffmpeg:

INCLUDEPATH += $$PWD/../FFmpeg431dev/include


LIBS    +=  $$PWD/../FFmpeg431dev/lib/avcodec.lib \

            $$PWD/../FFmpeg431dev/lib/avdevice.lib \

            $$PWD/../FFmpeg431dev/lib/avfilter.lib \

            $$PWD/../FFmpeg431dev/lib/avformat.lib \

            $$PWD/../FFmpeg431dev/lib/avutil.lib \

            $$PWD/../FFmpeg431dev/lib/postproc.lib \

            $$PWD/../FFmpeg431dev/lib/swresample.lib \

            $$PWD/../FFmpeg431dev/lib/swscale.lib




三)开始写code

包含头文件,注意QT为C++开发环境,FFMpeg用的是C 开发的,在CPP导入C的特性,需加关键词“ extern  “C”“


extern "C"{

#include <libavcodec/avcodec.h>

#include <libavformat/avformat.h>

#include <libswscale/swscale.h>

#include <libavdevice/avdevice.h>

#include <libavformat/version.h>

#include <libavutil/time.h>

#include <libavutil/mathematics.h>

}



定义相关宏,否则就报错,如error: #error missing -D__STDC_CONSTANT_MACROS”


extern "C"{

#ifdef __cplusplus

#define __STDC_CONSTANT_MACROS

#ifdef _STDINT_H

#undef _STDINT_H

#endif

#include <stdint.h>

#endif

}

添加如下code,若能成功输出ffmpeg version信息,则代表开发环境搭建成功。


int main(int argc, char* argv[])

{

    QCoreApplication a(argc, argv);

    qDebug()<< avcodec_configuration();

    unsigned version = avcodec_version();

    QString ch = QString::number(version,10);

    qDebug()<< "version:"<<version;

    return a.exec();

}


四)运行程序,需要复制dll


将share文件下dll文件 copy to 该工程生成的exe文件所在的目录。

否则会“程序异常退出”。






搭建环境SDL2.0+Qt5.9


1 下载SDL2

http://www.libsdl.org/download-2.0.php



2 解压SDL2.0



3 Qt5项目文件添加

INCLUDEPATH+=E:/FFMPEG/SDL2/include

LIBS += -LE:/FFMPEG/SDL2/lib/x86 -lSDL2

LIBS += -LE:/FFMPEG/SDL2/lib/x86 -lSDL2main

LIBS += -LE:/FFMPEG/SDL2/lib/x86 -lSDL2test



注意:(栽跟头)

///// SDL library already declare main funtion...

#undef main



4 测试代码



一、环境

Win7 64


qt-opensource-windows-x86-5.9.8.exe


SDL 2.0.9


 


二、下载

Qt可直接下载的页面

SDL2下载页面

SDL2下载的是VC版本



三、新建qt项目

1、新建一个纯C项目

2、把SDL文件放到项目中




3、修改qt项目设置

pro文件加入SDL路径

INCLUDEPATH += ../SDL2/SDL2/include/


LIBS += -L../SDL2/SDL2/lib/x86 -lSDL2

LIBS += -L../SDL2/SDL2/lib/x86 -lSDL2main

LIBS += -L../SDL2/SDL2/lib/x86 -lSDL2test

 


 


项目设置-RUN的环境变量中加入SDL2.DLL的路径

如果这部漏了,就会出错。SDL2 exited with code -1073741515



四、添加测试代码

复制代码
#include <stdio.h>
#include "SDL.h"
#undef main
int main()
{
    SDL_Window* gWindow = NULL;
    SDL_Surface* gScreenSurface = NULL;
    if(SDL_Init(SDL_INIT_VIDEO)<0)
    {
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        return 0;
    }
    gWindow=SDL_CreateWindow("SHOW BMP",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,215,134,SDL_WINDOW_SHOWN);
    if(gWindow==NULL)
    {
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        return 0;
    }
    gScreenSurface=SDL_GetWindowSurface(gWindow);
    SDL_FillRect(gScreenSurface, NULL, SDL_MapRGB(gScreenSurface->format, 0xFF, 0x00, 0x00));
    SDL_UpdateWindowSurface(gWindow);
    SDL_Delay(2000);
    SDL_FreeSurface( gScreenSurface );
    gScreenSurface = NULL;
    SDL_DestroyWindow(gWindow);
    gWindow = NULL ;
    SDL_Quit();
    return 0;
}


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***