一 前言
上一期,《用 Visual Studio 2019 编译 FFmpeg 简单教程》讲述了,如何用 Visual Studio 2019 编译构建 FFmpeg,用来学习 FFmpeg。
本人平时喜欢把一些视频文件转码保存,使用的编码器分别是:视频用 libx264,音频用?libmp3lame。但是基于默认配置而编译的 ffmpeg 不包含这俩编码器,他们属于第三方编码器,所以要自己下载这俩编码器的源码,自己先编译成库供FFmpeg使用。
二 准备
lame:
官网在这里 https://lame.sourceforge.io/ 页面链接到这里:https://sourceforge.net/projects/lame/files/lame/ 本人下载的版本是 3.100 ( lame-3.100.tar.gz )
x264:
通过 git 克隆一份 git clone http://git.videolan.org/git/x264.git
FFmpeg就用上一篇文章用的 ffmpeg 4.4。在弄之前,建议先设置好目录布局,本人的是:
三 编译?
● 编译 x264
cd /g/FFmpegAbout/
mkdir x264building
cd x264building
CC=cl ../x264/configure --enable-static --enable-shared --disable-cli --enable-debug --disable-asm --prefix=`pwd`/../x264build
make && make install
● 编译 lame
?修改 <lame_src_path>\include\libmp3lame.sym 把,确保第二行内容【lame_init_old】删掉
cd /g/FFmpegAbout/
mkdir lamebuilding
cd lamebuilding
CC=cl ../lame-3.100/configure --enable-shared --enable-static --enable-debug=alot --prefix=`pwd`/../lamebuild
make && make install
● 编译 FFmepg
cd /g/FFmpegAbout/
mkdir ffmpegbuilding
cd ffmpegbuilding
echo 编辑 build.sh 文件,并执行
./build.sh
原始 build.sh 文件内容如下:
#!/bin/sh
../ffmpeg-4.4/configure \
--prefix=`pwd`/../ffmpegbuild \
--toolchain=msvc \
--enable-gpl \
--enable-version3 \
--disable-stripping \
--disable-asm \
--enable-shared \
--enable-libmp3lame \
--extra-cflags="-I`pwd`/../lamebuild/include" \
--extra-ldflags="-LIBPATH:`pwd`/../lamebuild/lib" \
--enable-libx264 \
--extra-cflags="-I`pwd`/../x264build/include" \
--extra-ldflags="-LIBPATH:`pwd`/../x264build/lib"
make -j6 && make install && echo OOOOOOOOKKKKKKKKKKKKKK!!!!!!!!!!
● 默认情况下,代码是链接到动态链接库的(x264),所以需要改变配置脚本:
../ffmpeg-4.4/configure \
--prefix=`pwd`/../ffmpegbuild \
--toolchain=msvc \
--enable-gpl \
--enable-version3 \
--disable-stripping \
--disable-asm \
--enable-shared \
--enable-libmp3lame \
--extra-cflags='-I`pwd`/../lamebuild/include' \
--extra-ldflags='-LIBPATH:`pwd`/../lamebuild/lib' \
--enable-libx264 \
--extra-cflags='-DX264_API_IMPORTS -I`pwd`/../x264build/include' \
--extra-ldflags='-LIBPATH:`pwd`/../x264build/lib' \
--extra-libs='libx264.dll.lib'
● 如果需要链接到静态链接库(x264),那么编译前,在保持原始 build.sh 文件不变动的情况下,修改 <ffmpeg_src_dir>/libavcodec/libx264.c 文件,把 36 行注释掉,确保其不生效:
????????
否则会出现编译错误:
LD libavcodec/avcodec-58.dll
正在创建库 libavcodec/avcodec.lib 和对象 libavcodec/avcodec.exp
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_default,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_parse,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_cleanup,函数 _X264_close 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_default_preset,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_apply_fastfirstpass,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_apply_profile,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_picture_init,函数 _X264_frame 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_open_164,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_reconfig,函数 _reconfig_encoder 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_headers,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_encode,函数 _X264_frame 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_close,函数 _X264_close 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_delayed_frames,函数 _X264_frame 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_encoder_maximum_delayed_frames,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_levels,函数 _X264_init 中引用了该符号
libavcodec\avcodec-58.dll : fatal error LNK1120: 15 个无法解析的外部命令
make: *** [/g/FFmpegAbout/ffmpeg-4.4/ffbuild/library.mak:103: libavcodec/avcodec-58.dll] Error 96
因为这是告诉编译系统,我要链接的符号是 DLL 里的。
四 说明
●?--extra-cflags、?--extra-ldflags 与 --extra-libs 的使用
--extra-cflags、?--extra-ldflags 是显示指示模块的头文件与库文件的位置。
--extra-libs 是指定链接到哪个库文件,如果不指定,应该是使用在配置文件里已经设置了的默认值
五 后记
我试了一下用我生成的? ffmpeg 转换了一个文件,与官方发布的已编译的版本相比,真慢啊~~
不过,本人目的就是为了学习 ffmpeg ,所以不在乎了。
|