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的配置的主要内容,如果未能解决你的问题,请参考以下文章

发现工业之美 | 中国传媒大学专家一行莅临ALVA Systems 洽谈指导

ffmpeg和SDL的配置

ffmpeg和SDL的配置

最简单的基于JavaEE和FFmpeg的视频网站

中国传媒大学史上最全的《电视原理》笔记

基于ffmpeg+SDL视频播放器制作任务概述