本教程所对应的SDK下载链接:

https://download.csdn.net/download/XiBuQiuChong/88657539

本课对应源文件下载链接:

https://download.csdn.net/download/XiBuQiuChong/88657528

一、配置开发环境

1.下载FFmpeg+OpenCV开发所用的SDK压缩包,并解压到E:\SDK下,解压后的路径应为:E:\SDK\ffmpeg-sdk\58\x86\dll及E:\SDK\opencv-sdk\340\x86\dll。

2.新建VC++项目,名称为demo,项目类别为MFC应用程序,并按以下图示进行配置,其余选项默认即可。

3.删除对话框中默认控件,右单击打开工程“属性”页并配置包含文件目录及库目录。

(1)配置属性-VC++目录-包含目录:

json\include;E:\SDK\dx-sdk\x86\include\baseclasses;E:\SDK\opencv-sdk\340\x86\include;E:\SDK\ffmpeg-sdk\58\x86\include;

(2)配置属性-VC++目录-库目录:

json\lib;E:\SDK\dx-sdk\x86\lib;E:\SDK\oencv-sdk\340\x86\lib;E:\SDK\ffmpeg-sdk\58\x86\lib;

(3)配置属性-链接器-输入-附加依赖项:

avcodec.lib;avformat.lib;avutil.lib;avdevice.lib;avfilter.lib;postproc.lib;swresample.lib;swscale.lib;strmbase.lib;winmm.lib;opencv_core340d.lib;opencv_highgui340d.lib;opencv_imgproc340d.lib;opencv_videoio340d.lib;

二、编写代码测试环境搭建是否正确。

1.右单击项目新建类,类名为fmlp。

2.打开fmlp.h并加入常用头文件,注意ffmpeg头文件要用extern"C"包含。

// 防止头文件重复包含

#pragma once

#include <dshow.h>

#include <queue>

// 引入FFmpeg相关库(音视频编解码、格式处理等核心功能)

extern "C"

{

#include "libavcodec/avcodec.h"

#include "libavformat/avformat.h"

#include "libavutil/avutil.h"

#include "libswscale/swscale.h"

#include "libswresample/swresample.h"

#include "libavdevice/avdevice.h"

#include "libavfilter/buffersink.h"

#include "libavfilter/buffersrc.h"

#include "libavcodec/dxva2.h" 

#include "libavutil/opt.h"

#include "libavutil/pixdesc.h"

#include "libavutil/time.h"

#include "libavutil/mathematics.h"

#include "libavutil/audio_fifo.h"

#include "libavutil/imgutils.h"

};

// 引入OpenCV库(图像处理与计算机视觉功能)

#include <opencv/cxcore.h>

#include <opencv/cv.h> 

#include <opencv2/opencv.hpp>

#include <opencv2/core/core.hpp> 

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/highgui/highgui_c.h>

using namespace std;

// 自定义类fmlp(结合多媒体与图像处理功能)

class fmlp

{

public:

    fmlp();   // 构造函数

    ~fmlp();  // 析构函数

    int init(); // 初始化方法(返回状态码)

};

3.打开fmlp.cpp并输入以下测试代码:

// 包含预编译头文件(通常包含常用系统头文件和库声明)

#include "stdafx.h"

// 包含当前类的头文件

#include "fmlp.h"

// fmlp类的构造函数

fmlp::fmlp()

{

    // 构造时调用初始化函数

    init();

}

// fmlp类的析构函数(目前为空,可用于释放资源)

fmlp::~fmlp()

{

}

// fmlp类的初始化函数

int fmlp::init()

{

    // 输出初始化信息(调试用)

    TRACE("init.....\n");

    // 用于存储编码器/解码器信息的缓冲区

    char info[40000] = { 0 };

    // 注册FFmpeg所有可用的编解码器、格式等(FFmpeg旧版本初始化必要步骤)

    av_register_all();

    // 获取第一个编解码器指针(用于遍历所有编解码器)

    AVCodec *avcodec = av_codec_next(NULL);

    // 遍历所有编解码器

    while (avcodec != NULL) {

         // 判断是解码器还是编码器并添加标识

         if (avcodec->decode != NULL) {

             sprintf(info, "%s[Dec]", info);  // 解码器标识

         }

         else {

             sprintf(info, "%s[Enc]", info);  // 编码器标识

         }

         // 判断编解码器类型(视频/音频/其他)并添加标识

         switch (avcodec->type) {

         case AVMEDIA_TYPE_VIDEO:

             sprintf(info, "%s[Video]", info);  // 视频类型

             break;

         case AVMEDIA_TYPE_AUDIO:

             sprintf(info, "%s[Audio]", info);  // 音频类型

             break;

         default:

             sprintf(info, "%s[Other]", info);  // 其他类型

             break;

         }

         // 拼接编解码器名称

         sprintf(info, "%s[%10s]\n", info, avcodec->name);

         // 移动到下一个编解码器

         avcodec = avcodec->next;

         // 输出当前编解码器信息(调试用)

         TRACE("%s", info);

    }

    // 初始化成功,返回0

    return 0;

}

4.在demoDlg.h中引入fmlp的头文件以便在主对话框中使用fmlp类:

#include "fmlp.h"

5.在主对话框的OnInitDialog()函数中加入以下代码:

// TODO:  在此添加额外的初始化代码

fmlp *myFmlp = new fmlp();

return TRUE// 除非将焦点设置到控件,否则返回 TRUE

三、调试运行

1.单击工具栏上的“本地Windows调试器”开始运行程序,提示以下错误:

2.把SDK目录下的dll拷贝到debug目录再次运行,错误消除。

3.再次单击工具栏上的“本地Windows调试器”运行程序,程序正常运行且能输出以下信息则表示环境配置成功。

Logo

一站式 AI 云服务平台

更多推荐