macOS上将ffmpeg.c编译成Framework

05-13 1302阅读

1 前言

    本文介绍下在macOS上将ffmpeg的fftools目录下的ffmpeg.c程序,也就是ffmpeg的命令行程序,编译成framework的方法。编译成.a或.dylib的方法类似。 

    编译环境如下:

  • xcode15.3;
  • ffmpeg release/6.1;

    2 编译ffmpeg

        首先clone我们的FFmpeg代码仓到本地,并更名为ffmpeg,切换分支为release/6.1:

    git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg && git checkout release/6.1

        然后在ffmpeg的根目录执行如下命令,由于是学习使用,configure配置的是缺省选项,编译后安装目录在根目录下的mac_build目录下: 

    mkdir -p mac_build && ./configure --prefix=./mac_build

         然后执行如下命令,编译并安装ffmpeg:

    make -j8 && make install

         configure并编译安装完成之后,会在根目录下生成如下文件:

    • configure配置完毕,会在根目录产生config.h和config_components.h文件;
    • 生成了ffmpeg/ffplay/ffprobe可执行文件;
    • mac_build目录是ffmpeg的bin/include/lib/share文件;

      macOS上将ffmpeg.c编译成Framework

          其中,mac_build目录结构如下: 

      xxxxxx@localhost:~/Applications/workspace/av/ffmpeg/mac_build$tree -L 2
      .
      ├── bin
      │   ├── ffmpeg
      │   ├── ffplay
      │   └── ffprobe
      ├── include
      │   ├── libavcodec
      │   ├── libavdevice
      │   ├── libavfilter
      │   ├── libavformat
      │   ├── libavutil
      │   ├── libswresample
      │   └── libswscale
      ├── lib
      │   ├── libavcodec.a
      │   ├── libavdevice.a
      │   ├── libavfilter.a
      │   ├── libavformat.a
      │   ├── libavutil.a
      │   ├── libswresample.a
      │   ├── libswscale.a
      │   └── pkgconfig
      └── share
          ├── ffmpeg
          └── man
      15 directories, 10 files

          编译安装完成之后,就可以拿该目录下的include和lib下的文件引入到工程使用了。 

      3 编译ffmpeg.c

      3.1 新建xcode工程

          打开xcode新建一个xcode的app工程:

      macOS上将ffmpeg.c编译成Framework

          然后,新建一个target,FFmpegFramework,接着把ffmpeg相关c程序拖进来编译:

      macOS上将ffmpeg.c编译成Framework

          然后在FFmpegFramework => Build Settings => Search Paths里加入ffmpeg的include和lib以及config.h的搜索路径:

      macOS上将ffmpeg.c编译成Framework

          到此,xcode工程和FFmpegFramework的创建和初始化工作完成,接下来就是将FFmpegFramework编译成framework了。 

      3.2 改写ffmpeg.c的接口方法

      • 在ffmpeg.h文件中,将int main(int argc, char* argv[])方法名改成ffmpeg;
      • ffmpeg.c对应文件的main方法名按以上同步修改为ffmpeg;

            ffmpeg.h头文件中修改方法名: 

        // 将main方法名改为ffmpeg名
        int ffmpeg(int argc, char* argv[]);

             ffmpeg.c同步修改方法名:

        // 将main方法名改为ffmpeg
        int ffmpeg(int argc, char **argv)
        {
            int ret, err_rate_exceeded;
            BenchmarkTimeStamps ti;
            init_dynload();
            setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */
            av_log_set_flags(AV_LOG_SKIP_REPEATED);
            parse_loglevel(argc, argv, options);
        #if CONFIG_AVDEVICE
            avdevice_register_all();
        #endif
            avformat_network_init();
            show_banner(argc, argv, options);
            /* parse options and open all input/output files */
            ret = ffmpeg_parse_options(argc, argv);
            if (ret  Search Paths => Header Search Paths/Library Search Paths中指定ffmpeg及其framework相关的include和lib文件: 
        

            include搜索路径:

        macOS上将ffmpeg.c编译成Framework

            lib搜索路径: 

        macOS上将ffmpeg.c编译成Framework     在learn-ffmpeg target中 Build Settings => Link Binary with Library中加入FFmpegFramework: 

        macOS上将ffmpeg.c编译成Framework

             接下来就可以顺利编译learn-ffmpeg程序,并开始调试ffmpeg.c程序了:

        macOS上将ffmpeg.c编译成Framework

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]