FFmpeg 公开课之PC上创建FFmpeg编译环境

873 阅读3分钟

上期回顾

FFmpeg 公开课之FFmpeg代码架构



现在音视频非常火热,FFmpeg又是音视频开发者绕不过去一个开源项目,我们一般在移动端上需要移植FFmpeg,但是Android上运行例子比较繁琐,而且编译运行都比较慢,这里我们推荐在PC上运行一下FFmpeg,在PC上调试好程序之后再移植到移动端上。

PC上编译

因为平时主要使用Mac开发程序的,所以也在Mac电脑上开始我们的编译工程。

下载FFmpeg源码

git clone https://github.com/FFmpeg/FFmpeg

下载好了之后,需要切换到罪行的分支:

git checkout -b local_n4.4 n4.4

最新的稳定版的tag是n4.4,我们以此为基础切换到这个分支。

configure配置

在电脑上配置FFmpeg,肯定是尽量支持多一点的特性。下面提供一个参考:

./configure --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack --disable-x86asm --prefix=/usr/local/ffmpeg

其中--prefix=/usr/local/ffmpeg表示安装在/usr/local/ffmpeg文件夹下面。

编译安装

依次执行下列指令:

sudo make -j4

sudo make install


编译完成之后,可以在/usr/local/ffmpeg查询一下安装的情况:

WX20210730-010054@2x.png

/usr/local/ffmpe目录下的文件都是接下来PC上运行ffmpeg例子需要用到的库。

  • bin 是 可执行文件
  • include 是编译头文件
  • lib 是依赖库
  • share 是config文件

share目录中文件非常重要,我们接下来编译需要它提供的pkg-config配置。

编译文件引用FFmpeg库

下面是我们需要编译的文件:

#include <stdio.h>

#include <libavformat/avformat.h>
#include <libavutil/dict.h>

int main (int argc, char **argv)
{
    AVFormatContext *fmt_ctx = NULL;
    AVDictionaryEntry *tag = NULL;
    int ret;

    if (argc != 2) {
        printf("usage: %s <input_file>\n"
               "example program to demonstrate the use of the libavformat metadata API.\n"
               "\n", argv[0]);
        return 1;
    }

    if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
        return ret;

    if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
        av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
        return ret;
    }

    while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
        printf("%s=%s\n", tag->key, tag->value);

    avformat_close_input(&fmt_ctx);
    return 0;
}

发现引用了avformat库,那我们编译的时候就要将avformat库编进去。编译执行的指令如下:

gcc -g -o metadata metadata.c `pkg-config --libs --cflags libavformat`

pkg-config --libs --cflags libavformat 就是找到libavformat对应的库索引:

-I/usr/local/Cellar/ffmpeg/4.4_2/include -L/usr/local/Cellar/ffmpeg/4.4_2/lib -lavformat

这样我们可以在PC上运用FFmpeg中的功能。

大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。

对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。 如果你的系统装有gtk,可以尝试一下下面的命令$pkg-config --cflags gtk+-2.0。可以看到其输出是gtk的头文件的路径。

我们平常都是这样用pkg-config的。 $gcc main.c pkg-config --cflags --libs gtk+-2.0 -o main

上面的编译命令中,**pkg-config --cflags --libs gtk+-2.0**的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。--cflags和--libs分别指定头文件和库文件。

Ps:命令中的`不是引号,而是数字1左边那个键位的那个符号。

其实,pkg-config同其他命令一样,有很多选项,不过我们一般只会用到--libs和--cflags选项。