#FFMPEG 4.3.1# Windows开发环境介绍与搭建(1)
- 一、介绍
- 二、FFMPEG4.3.1 SDK配置
- 1.首先下载ffmpeg的sdk文件。
- 2.下载并解压后获取如下文件。
- 3.创建文件夹,配置ffmpeg。
- 4.Visul Stdio 2017创建新项目。
- 三、FFMPEG4.3.1 SDK环境测试
一、介绍
FFMPEG是完整的跨平台解决方案,用于记录,转换和流式传输音频和视频。它包含可以由应用程序使用的libavcodec,libavutil,libavformat,libavfilter,libavdevice,libswscale和libswresample。与ffmpeg,ffplay和ffprobe一样,最终用户也可以使用它们进行转码和播放。
二、FFMPEG4.3.1 SDK配置
1.首先下载ffmpeg的sdk文件。
官网为https://ffmpeg.org/,但是目前由于种种原因(我也不清楚啥原因)无法下载,因此可以从下列网址ffmpeg4.3.1进行下载。考虑到大多数朋友没有会员或者下载积分,设置了粉丝可下载,只要关注就可以免费下载哦!
2.下载并解压后获取如下文件。
bin目录是binary(二进制)的缩写,一般用于存放可执行文件,这里存放的是ffmpeg执行时需要的动态链接库文件和可执行文件,由于开发环境的不同,分为arm、arm64、x86、x64,根据自己的开发环境进行配置。
include目录是ffmpeg的附加包含目录,包含ffmpeg开发所需要的宏定义、函数定义等头文件。
lib目录是library(库)的缩写,一般用于存放标准库文件,这里存放的是ffmpeg实现程序编译的库文件。
3.创建文件夹,配置ffmpeg。
在电脑的非系统盘下找个路径,比如E:\C++Code\FFMPEG下进行如下几个文件夹的创建:bin、include、lib、src。然后将ffmpeg三个文件目录下的对应内容复制过来。
图1 配置文件目录 | 图2 bin目录 |
图3 include目录 | 图4 lib目录 |
4.Visul Stdio 2017创建新项目。
VS可选用其他版本,具体差距不大,个人开发推荐使用社区版(免费/VisioStudio。
我使用的VS2017社区版,创建空项目如下,路径选择之前建立的src文件,这样的好处是环境配置好后,你可以在src建立多个新的项目而不需要重新配置ffmpeg的文件,但每次的属性还是要配置的!
创建好项目后,项目文件如下,头文件放置自己创建的".h"头文件,源文件放置自己创建的.cpp文件,资源文件为开发项目所需的资源,如图片等。在源文件中先创建一个main.cpp文件作为项目主函数文件,然后右击Demo项目选择属性进行四个属性配置。
四个属性的目录及取值如下,需要注意的是输出目录与工作目录为同一目录且需要根据项目环境进行相应的配置,比如我使用的x64环境开发就配置x64目录,附加库目录同理。
属性目录 | 值 |
常规–>输出目录 | . .\ . .\bin\x64 |
调试–>工作目录 | . .\ . .\bin\x64 |
C/C+±->常规–>附加包含目录 | . .\ . .\include |
链接器–>常规–>附加库目录 | . .\ . .\lib\x64 |
属性配置截图如下:
图1 输出目录 | 图2 工作目录 |
图3 附加库包含目录 | 图4 附加库目录 |
全部配置好后点击确定。
三、FFMPEG4.3.1 SDK环境测试
/**
* Hello World程序
*本程序是基于FFmpeg函数的最简单的程序。它可以打印出FFmpeg类库的下列信息:
* Protocol: FFmpeg类库支持的协议
* AVFormat: FFmpeg类库支持的封装格式
* AVCodec: FFmpeg类库支持的编解码器
* AVFilter: FFmpeg类库支持的滤镜
* Configure: FFmpeg类库的配置信息
*参考雷霄骅代码:
*/
#pragma once
#pragma warning(disable:4996) //解决sprintf函数报错问题
#include <stdio.h>
#include <string.h>
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
};
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avfilter.lib")
//FIX
struct URLProtocol;
/**
* Protocol Support Information
*/
char * urlprotocolinfo() {
char *info = (char *)malloc(40000);
memset(info, 0, 40000);
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);
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);
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);
memset(info, 0, 40000);
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);
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);
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);
getchar();
return 0;
}
执行后输出FFMPEG类库的相关信息,到此配置成功,可以开始自己的项目开发啦。