用 VS2019 编译带 libx264, libmp3lame 的 FFmpeg 库

本文详细介绍了如何在Windows环境下使用VisualStudio2019编译FFmpeg,同时集成第三方编码器libx264和libmp3lame。通过下载源码、配置目录、修改配置脚本,最终成功编译生成包含这两个编码器的FFmpeg库,尽管编译速度较官方版本慢,但满足了作者的学习需求。

一 前言

上一期,《用 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 ,所以不在乎了。

### 如何在 FFmpeg 中启用 libmp3lame 支持 为了使 FFmpeg 能够支持 MP3 编码,需要安装并配置 `libmp3lame` 。以下是具体的操作指南: #### 安装依赖项 确保系统已经安装了必要的构建工具和其他依赖包。对于基于 Debian 的发行版,可以运行以下命令来安装这些软件包: ```bash sudo apt-get update && sudo apt-get install autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev nasm yasm libmp3lame-dev ``` #### 下载和编译 LAME (LibMP3LAME) 如果系统的默认仓中没有提供最新版本的 lame 或者想要自定义编译,则可以从源代码编译它。 获取最新的稳定发布版本: ```bash cd ~/ffmpeg_sources wget http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz tar xzvf lame-3.100.tar.gz cd lame-3.100 ./configure --prefix="$HOME/ffmpeg_build" --enable-nasm --disable-shared make make install ``` #### 配置 FFmpeg 以使用 LibMP3LAME 当完成上述步骤之后,在编译 FFmpeg 前需指定路径让其找到已安装好的静态链接文件以及头文件位置。这通常通过设置环境变量或者直接传递给 configure 脚本的方式实现。 ```bash cd ~/ffmpeg_sources/ffmpeg PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include" \ --extra-ldflags="-L$HOME/ffmpeg_build/lib" \ --bindir="$HOME/bin" \ --enable-gpl \ --enable-libass \ --enable-libfdk-aac \ --enable-libfreetype \ --enable-libmp3lame \ --enable-libopus \ --enable-libtheora \ --enable-libvorbis \ --enable-libvpx \ --enable-libx264 \ --enable-libx265 \ --enable-nonfree make -j$(nproc) make install hash -r ``` 以上过程会下载、解压、编译并安装所需的组件到用户的家目录下的特定子目录中[^1]。 #### 使用 FFmpeg 进行 MP3 编码测试 一旦成功启用了 libmp3lame 功能,就可以利用 `-codec:a libmp3lame` 参数来进行音频流转换成 MP3 格式的操作了。下面是一个简单的例子说明如何将 WAV 文件转为高质量 VBR(可变比特率)模式下编码后的 MP3 文件: ```bash ffmpeg -i input.wav -c:v copy -c:a libmp3lame -qscale:a 2 output.mp3 ``` 这里使用的选项解释如下: - `-i input.wav`: 输入文件名为input.wav; - `-c:v copy`: 复制视频轨道而不重新编码; - `-c:a libmp3lame`: 设置音频编码器为libmp3lame; - `-qscale:a 2`: 设定VBR质量等级(范围是从0至9),数值越低表示音质越高,默认值为4;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值