由于工作需要,所有决定自己重新编译FFmpeg. 不编不知道,一编吓一跳。尼玛,全是坑。因此在此记录下我在编译的过程中遇到的所有坑,也希望大家都早日脱坑。
一、编译FFMPEG4.2.2
参考文章:https://blog.csdn.net/kejian1688/article/details/88055687
首先非常感谢这位大佬,在编译的过程中提供了很大的帮助,我编译的步骤也是按照他的步骤进行的。详细的编译过程可以参考他的文章,写的很详细。
1.安装vs2017
2.安装msys2
3.下载ffmpeg源码和SDL2源码
4.编译SDL2生成SDL2的静态库和动态库
5.设置msys2的编译环境
6.编译FFmpeg的静态库和动态库
1.执行下面指令:
./configure --enable-shared --enable-static --toolchain=msvc --prefix=x32 --enable-postproc -- enable-gpl --enable-avresample
1)报错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build
解决办法:这个是由于yasm没有安装,安装一下yasm即可。
https://blog.csdn.net/qqqq245425070/article/details/83961218
2.执行./configure命令后 改下 config.h 和 config.mak 编码格式,用notepad++改下就行。
3.转换完成以后执行编译命令
make -j4
1)报错:awk: cmd. line:1: /including/ { sub(/^.*file: */, "");
解决办法: https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=2440 这个帖子意思就是 此make非彼 make,所以重新安装了一下 https://blog.csdn.net/qiuzhiqian1990/article/details/56671839
下载make和gcc. ( 重启一下 )
pacman -S msys/make
pacman -S msys/gcc
4. 执行 make install。
7. 最后就是编译 ffmpeg.exe 、ffplay.exe 、 ffprobe.exe.
参考:https://blog.csdn.net/kejian1688/article/details/88055687
二、编译 FFMPEG 4.2.2 ( GPU + libx264 )
参考:https://www.jianshu.com/p/5f175dec9109
1. 编译x264, 下载地址:http://www.videolan.org/developers/x264.html,
编译过程参考:https://blog.csdn.net/u013295518/article/details/90273899
./configure --enable-static --disable-asm --disable-opencl --disable-cli -–prefix=/usr/local/x264
2. 安装 NIVIDA_Codec_SDK 和 nv-codec-headers, 参考:https://www.jianshu.com/p/032b47c48ada
3. 通过vs2017 x64命令工具进入msys , 执行 msys2_shell.cmd -mingw64。
4. 编译:
./configure --toolchain=msvc --target-os=win64 \
--arch=x86_64 \
--enable-shared \
--enable-small \
--enable-version3 \
--enable-gpl \
--enable-cuda --enable-cuvid --enable-nvenc \
--enable-nonfree \
--disable-stripping \
--disable-encoders \
--disable-decoders \
--enable-libx264 \
--enable-decoder=h264 \
--enable-encoder=libx264 \
--enable-encoder=mjpeg \
--enable-encoder=mpeg4 \
--prefix=./build \
--enable-libx264 \
--extra-cflags="-I/home/Video_Codec_SDK_9.1.23/include -I/usr/local/include" \
--extra-ldflags="-LIBPATH:/home/Video_Codec_SDK_9.1.23/Lib/x64 -LIBPATH/usr/local/lib"
-extra-cflags用于指定头文件路径,--extrac-ldflags用于指定库文件路径 ,--pkgconfigdir设置pkgconfig的安装目录,默认是[LIBDIR/pkgconfig],只有 --enable-shared 使的时候这个选项才有效 。
.configure 详情配置表: https://blog.csdn.net/momo0853/article/details/78043903
-LIBPATH : 不能使用 -L ,要不报错:找不到libx264。 参考:https://www.jianshu.com/p/5f175dec9109
5. 执行 make -j8 和 make install.
三:编译 FFmpeg 2.5.11
由于项目需要实现 G711 + H264 合成 mp4 文件, 但 FFmpeg 现在版本暂不支持 G711 编码, 所以参考:https://blog.csdn.net/zhuyunier/article/details/80814227 , 重新编译。
1. 修改 ffmpeg libavformat/movenc.c 文件 。
2. 进入mysy ,执行 :
./configure --prefix=install-2.5 --enable-static --enable-shared \
--enable-encoder=pcm_alaw --enable-decoder=pcm_alaw --enable-demuxer=mov \
--enable-debug --toolchain=msvc
报错:1)fatal error C1189: #error: Macro definition of vsnprintf conflicts with Standa
2)_cnt错误
3)avpriv_vsnprintf未定义
报了以上3个错误,参考https://blog.csdn.net/anbinger2013/article/details/49387377 ,这位大神全给解决了,真是给力,非常感谢.
3. make -j8 和 make install
四:由于项目中需要 h264 编解码功能,所以重新编译,增加h264功能。
./configure --toolchain=msvc --target-os=win64 \
--arch=x86_64 \
--enable-static \
--enable-shared \
--enable-small \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-encoders \
--disable-decoders \
--enable-libx264 \
--enable-decoder=h264 \
--enable-encoder=libx264 \
--enable-encoder=mjpeg \
--enable-encoder=mpeg4 \
--enable-encoder=pcm_alaw --enable-decoder=pcm_alaw --enable-demuxer=mov \
--prefix=install-2.5-264 \
--enable-libx264 \
--extra-cflags="-I/home/x264-old/x264-2017/installed/include" \
--extra-ldflags="-LIBPATH:/home/x264-old/x264-2017/installed/lib"
1. 我尝试使用最新的libx264编译,结果报错:x264_bit_depth 未定义标识符。
网上查说是版本与ffmpeg 版本不匹配,我想可能是因为我使用的老版本的ffmpeg(2.5.11),所以我找了一个老版本的下载。下载地址: https://code.videolan.org/videolan/x264/-/tree/c7a2e327bebd2b863c2620b6962fa18ab681e5dd
2. 编译libx264:
CC=cl ./configure --enable-static --prefix=${PWD}/installed
3. 编译ffmpeg
4. make -j8 && make install
5. 搞定
** make clean 编译错误,可以清除编译环境,重新编译.
五:增加水印功能
项目中要使用水印功能,所以重新编译,增加 drawtext 功能。
最先编译的 ffmpeg 2.5版本,但总是报错,报的我脑瓜嗡嗡的,所以果断换了一个 ffmpeg 3.1 的版本搞。
详细可参考博主,写的很详细,非常感谢。。
1. 下载 freetype 地址:https://download.savannah.gnu.org/releases/freetype/ ,选择的 2.9
./configure --prefix=/usr/local/freetype
make
make install
2. 下载 libxml2 地址:http://xmlsoft.org/sources/ ,选择的 2.9.8
./configure --without-python --prefix=/usr/local/libxml2
make
make install
不加 --without-python , 报错。
3. 下载 fontconfig 地址:https://www.freedesktop.org/software/fontconfig/release/ ,选择的 2.13.92
export PKG_CONFIG_PATH=/usr/local/libxml2/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/local/freetype/lib/pkgconfig:$PKG_CONFIG_PATH
pacman -S gperf
./configure --enable-libxml2 --with-freetype-config=/usr/local/freetype/bin/freetype-config --prefix=/usr/local/fontconfig
make
make install
4. 下载 fribidi 地址: https://github.com/fribidi/fribidi
./configure --prefix=/usr/local/fribidi
make
make install
报错: undefined reference to `fribidi_char_set_name' ..... 各种错误,也不是很懂
解决 :https://github.com/fribidi/fribidi/commit/7c155c64ea91d9ad3a25cdf35c904e4cb2484448 参考这个改,重新编译即可。
5. 编译 ffmpeg
PKG_CONFIG_PATH="/usr/lib/pkgconfig" ./configure --target-os=mingw64 --arch=x86_64 --enable-static \
--enable-shared \
--enable-small \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--enable-libfreetype \
--enable-libfontconfig \
--enable-libfribidi \
--enable-libx264 \
--enable-decoder=h264 \
--enable-encoder=libx264 \
--enable-encoder=pcm_alaw --enable-decoder=pcm_alaw --enable-demuxer=mov \
--extra-cflags="-I/usr/local/libx264/include -I/usr/local/fontconfig/include -I/usr/local/freetype/include/freetype2 -I/usr/local/libxml2/include -I/usr/local/fribidi/include/fribidi" \
--extra-ldflags="-L/usr/local/libx264/lib -L/usr/local/fontconfig/lib -L/usr/local/freetype/lib -L/usr/local/libxml2/lib -L/usr/local/fribidi/lib" \
--prefix=/usr/local/ffmpeg
1) 将各个 pkgconfig 中的 .pc 文件拷贝到 usr/lib/pkgconfig 路径下
2)增加 PKG_CONFIG_PATH="/usr/lib/pkgconfig" ,要不一直报错 pkg-config not found ,很是烦躁,尝试增加环境变量export PKG_CONFIG_PATH=/usr/local/xxx/lib/pkgconfig:$PKG_CONFIG_PATH , 但怎么编译都不好使,如果有知道的,希望能指导一下下。
3)--extra-ldflags 和 --extra-cflags :指定类库和头文件。
4)make -j8 and make install
5) 测试下。
ffmpeg -i 1.mp4 -vf "drawtext=fontfile=simhei.ttf: text=‘TEST’:x=50:y=50:fontsize=24:fontcolor=white:shadowy=2" output.mp4
资源:
FFmpeg 2.5.11 编译好的版本(不支持h264):https://download.csdn.net/download/haiyangyunbao813/12247951
FFmpeg 2.5.11 编译好的版本(支持h264):https://download.csdn.net/download/haiyangyunbao813/12252439
基于 FFmpeg2.5.11 实现 g711+h264 保存mp4: https://download.csdn.net/download/haiyangyunbao813/12250922
** demo 没有使用h264编解码,如需使用,则需自行替换ffmpeg.
续:
FFmpeg 4.1 支持 CUDA: https://download.csdn.net/download/haiyangyunbao813/13669565
FFmpeg 4.1 支持 QSV (不支持CUDA): https://download.csdn.net/download/haiyangyunbao813/15819694