Window10 VS2017 编译FFmpeg 支持 G711 + H264 写入 mp4

 

由于工作需要,所有决定自己重新编译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 的版本搞。

 

 

参考:https://blog.csdn.net/u014552102/article/details/104442111?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

详细可参考博主,写的很详细,非常感谢。。

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

 

 

以上仅供参考,祝大家早日脱离苦海。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值