上期回顾
现在音视频非常火热,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查询一下安装的情况:
/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选项。