ffmpeg和SDL的配置
Posted yuyaweibest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg和SDL的配置相关的知识,希望对你有一定的参考价值。
一、ffmpeg和SDL的配置
本次用到的是window 64下,ffmpeg version3.2.2,SDL version 2.0.5和VS2012
具体配置如下:
1. FFmpeg配置
1.1.从ffmpeg官网https://ffmpeg.org下载ffmpeg库或从上篇博客的百度云分享中下载所有资料
从https://ffmpeg.zeranoe.com/builds下载与电脑相对应的版本
以windows 64位version 3.2.2为例:下载Linking中的Static和Dev或Shared和Dev,其中Static和Shared等效,需要配置里面的bin文件夹,Static版本的bin文件夹内存较大,Shared版本的bin文件夹内存较小,里面包含了一些动态链接库dll文件,供可执行文件ffmpeg.exe,ffplay.exe和ffprobe.exe调用,而Static版本的bin文件夹中只有三个可执行文件ffmpeg.exe,ffplay.exe和ffprobe.exe,Shared版本更有利于分享。
1.2.ffmpeg在vs2012中的配置
下载Shared和Dev版本,并解压,复制取出Shared版本中的bin文件夹,Dev版本的include和lib文件夹,粘贴至新建的ffmpeg文件夹中。
ffmpeg路径随意,配置会用到,本文是C:\\softwares\\ffmpeg。
1.3.环境变量的配置:
右击计算机》属性》高级系统设置》环境变量》系统变量(全部用户均可使用)or Administrator的用户变量(仅此用户可以使用),本文选择配置系统变量。在系统变量中拉动滑动框,找到变量Path,点击编辑,把bin文件夹的路径添加进去,注意和上一个路径用 ; 隔开。
具体以自己的ffmpeg文件夹位置来配置。点击确定退出。
1.4.VS2012的配置
打开VS2012,新建一个Win32控制台应用程序的空白工程。
点击上方工具栏,在本地Windows调试器中选择Debug x64调试器(因为下载的库是64位)。
点击左下角找到“属性管理器”,选中Debug|x64,右击选择添加新项目属性表,本文命名为ffmpeg,最后添加。
选中新建的ffmpeg属性表,右击属性开始,选中VC++目录,在常规中,把ffmpeg文件中的include头文件夹和lib文件夹分别添加至包含目录和库目录,最终结果如下。
选中链接器》输入 》添加依赖项目,把lib文件夹中的八个.lib文件分别手动添加进去,确定,最终结果如下:
最后确定退出,把下面完整程序拷入项目中进行测试,无错说明配置成功。(把此属性表保存,以后每次需要时添加此属性表,不需要再重新配置)
/**
* 最简单的FFmpeg Helloworld程序
* Simplest FFmpeg HelloWorld
*
* 雷霄骅 Lei Xiaohua
* leixiaohua1020@126.com
* 中国传媒大学/数字电视技术
* Communication University of China / Digital TV Technology
* http://blog.csdn.net/leixiaohua1020
*
*
* 本程序是基于FFmpeg函数的最简单的程序。它可以打印出FFmpeg类库的下列信息:
* Protocol: FFmpeg类库支持的协议
* AVFormat: FFmpeg类库支持的封装格式
* AVCodec: FFmpeg类库支持的编解码器
* AVFilter: FFmpeg类库支持的滤镜
* Configure: FFmpeg类库的配置信息
*/
#include <stdio.h>
#define __STDC_CONSTANT_MACROS //ffmpeg库需要用到
#ifdef _WIN32
//Windows
extern "C" //使用C语言编写的库能够在C++中正常使用
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
;
#else
//Linux...
#ifdef __cplusplus
extern "C"
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfilter.h>
#ifdef __cplusplus
;
#endif
#endif
//FIX
struct URLProtocol;
/**
* Protocol Support Information
*/
char * urlprotocolinfo()
char *info=(char *)malloc(40000);
memset(info,0,40000);
av_register_all();
struct URLProtocol *pup = NULL;
//Input
struct URLProtocol **p_temp = &pup;
avio_enum_protocols((void **)p_temp, 0);
while ((*p_temp) != NULL)
sprintf(info, "%s[In ][%10s]\\n", info, avio_enum_protocols((void **)p_temp, 0));
pup = NULL;
//Output
avio_enum_protocols((void **)p_temp, 1);
while ((*p_temp) != NULL)
sprintf(info, "%s[Out][%10s]\\n", info, avio_enum_protocols((void **)p_temp, 1));
return info;
/**
* AVFormat Support Information
*/
char * avformatinfo()
char *info=(char *)malloc(40000);
memset(info,0,40000);
av_register_all();
AVInputFormat *if_temp = av_iformat_next(NULL);
AVOutputFormat *of_temp = av_oformat_next(NULL);
//Input
while(if_temp!=NULL)
sprintf(info, "%s[In ] %10s\\n", info, if_temp->name);
if_temp=if_temp->next;
//Output
while (of_temp != NULL)
sprintf(info, "%s[Out] %10s\\n", info, of_temp->name);
of_temp = of_temp->next;
return info;
/**
* AVCodec Support Information
*/
char * avcodecinfo()
char *info=(char *)malloc(40000);
memset(info,0,40000);
av_register_all();
AVCodec *c_temp = av_codec_next(NULL);
while(c_temp!=NULL)
if (c_temp->decode!=NULL)
sprintf(info, "%s[Dec]", info);
else
sprintf(info, "%s[Enc]", info);
switch (c_temp->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, c_temp->name);
c_temp=c_temp->next;
return info;
/**
* AVFilter Support Information
*/
char * avfilterinfo()
char *info=(char *)malloc(40000);//向系统申请分配指定size个字节的内存空间
memset(info,0,40000);//在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。
//void *memset(void *s, int c, size_t n);
avfilter_register_all();
AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);
while (f_temp != NULL)
sprintf(info, "%s[%15s]\\n", info, f_temp->name);
f_temp=f_temp->next;
return info;
/**
* Configuration Information
*/
char * configurationinfo()
char *info=(char *)malloc(40000);
memset(info,0,40000);
av_register_all();
sprintf(info, "%s\\n", avcodec_configuration());
return info;
int main(int argc, char* argv[])
char *infostr=NULL;
infostr=configurationinfo();
printf("\\n<<Configuration>>\\n%s",infostr);
free(infostr);//解决memset函数分配的内存
infostr=urlprotocolinfo();
printf("\\n<<URLProtocol>>\\n%s",infostr);
free(infostr);
infostr=avformatinfo();
printf("\\n<<AVFormat>>\\n%s",infostr);
free(infostr);
infostr=avcodecinfo();
printf("\\n<<AVCodec>>\\n%s",infostr);
free(infostr);
infostr=avfilterinfo();
printf("\\n<<AVFilter>>\\n%s",infostr);
free(infostr);
while(true)
return 0;
结果:
2. SDL配置(windows 64位)
2.1.从链接:http://pan.baidu.com/s/1bpsyU5L 密码:j83e或SDL官网下载http://www.libsdl.org/download-2.0.php
首先选中1,其中2为SDL的源码,C语言编写,在编写过程中,如果遇到不明白的函数,可以在源码中查找相应函数的定义。3为配置所需要的文件,解压结果如下:
这里面我们将会用到的是lib下的x64文件夹和include两个文件夹。
2.2.环境变量的配置:
右击计算机》属性》高级系统设置》环境变量》系统变量(全部用户均可使用)or Administrator的用户变量(仅此用户可以使用),本文选择配置系统变量。在系统变量中拉动滑动框,找到变量Path,点击编辑,把bin文件夹的路径添加进去,注意和上一个路径用 ; 隔开。
如果是64位,则配置到x64文件夹,如我把文件解压至E盘的softwares文件夹下,
E:\\softwares\\SDL2_2.0.5\\lib\\x64,方法同1.3类似。
2.3.VS2012的配置
2.3.1.打开VS2012,新建一个Win32控制台应用程序的空白工程。
2.3.2点击上方工具栏,在本地Windows调试器中选择Debug x64调试器(因为配置的是64位)。
2.3.3点击左下角找到“属性管理器”,选中Debug|x64,右击选择添加新项目属性表,本文命名为SDL,最后添加。
2.3.4选中新建的SDL属性表,右击属性开始,选中VC++目录,在常规中,把SDL2_2.0.5文件夹中的include头文件夹和lib文件夹下的x64文件夹分别添加至包含目录和库目录。
2.3.5选中链接器》输入 》添加依赖项目,把lib/x64文件夹下的SDL2.lib和SDL2main.lib分别手动添加进去。
最终结果如下:
最后确定退出,把下面完整程序拷入项目中进行测试,无错说明配置成功。(把此属性表保存,以后每次需要时添加此属性表,不需要再重新配置)
#include <SDL.h>
#include <iostream>
using namespace std;
// 由于SDL内部重定义了main, main函数一定得是这个形式,具体为何,后面详细说明
int main(int argc, char * argv[])
// 初始化SDL
if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)== -1))
// 初始化失败,打出错误,注意SDL_GetError返回一个字符串
cout<<"Could not initialize SDL: %s.\\n"<< SDL_GetError();
else
cout<<"SDL initialize ok!";
// 结束SDL
SDL_Quit();
cin.get();
return 0;
配置成功的输出:
注意:入口函数不能写成main(),必须有参数,因为SDL将内部已经实现了入口函数,这里的main其实是SDL_main
以上是关于ffmpeg和SDL的配置的主要内容,如果未能解决你的问题,请参考以下文章