Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357533
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 606
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-30 08:58
个人简介

x

文章分类

全部博文(94)

文章存档

2019年(4)

2018年(10)

2017年(26)

2016年(38)

2015年(16)

我的朋友

分类: 架构设计与优化

2016-05-20 13:17:13

  动态(共享)链接库自是有诸多优于静态链接库的特点:如能共享内存空间; 节约整个系统的存储空间,从而使整个系统速度提高; 当只有某个动态链接库有更新时--便于维护--只用更新这个库。
  但在有些情况下,如,服务器并不是你一个人独享;服务器上不止有一个版本的ffmpeg要用; 有一个集群的服务器需要你部署和维护,更新。这时能使用静态链接库就再好不过啦。

   FFmpeg对第三方库通常是优先使用动态链接的。可以使用下面介绍的步骤实现这些第三方库的静态链接,从而你的ffmpeg只用copy一个程序就可以到处用,也方便了部署和维护。
第三方库:(3RDLIB_INSTALL_PATH为本机上你想将第三方库安装的路径)
1. libfaac
#cd  faac-1.28
#./configure --prefix=3RDLIB_INSTALL_PATH --enable-static --disable-shared
#make;make install

2. libmp3lame
#cd lame-3.98.4
#./configure --prefix=3RDLIB_INSTALL_PATH --enable-static --disable-shared
#make; make install
NOTE:
因为它的configure参数并不起作用,所以一定要到3RDLIB_INSTALL_PATH/lib下将libmp3lame的动态库都删除。

3. libx264
#cd x264-snapshot-VERSION
#./configure --prefix=3RDLIB_INSTALL_PATH --enable-static
#make; make install

FFmpeg的配置
#cd ffmpeg
#./configure 
--enable-gpl --enable-nonfree --enable-version3 
--disable-shared --enable-static 
--enable-pthreads --enable-runtime-cpudetect 
--enable-zlib --enable-bzlib \
--enable-postproc 
--extra-cflags='-I3RDLIB_INSTALL_PATH/include -DREDIRECT_DEBUG_LOG' 
--extra-ldflags='-L3RDLIB_INSTALL_PATH/lib -gl' 
--enable-libxvid --enable-decoder=libxvid --enable-encoder=libxvid 
--disable-encoder=aac 
--enable-libfaac --enable-encoder=libfaac 
--enable-libmp3lame --enable-encoder=libmp3lame 
--enable-libx264 --enable-encoder=libx264 
--enable-avfilter --enable-filter=movie
#make; 

其实,静态链接的关键就是要保证在你的库路径“3RDLIB_INSTALL_PATH”下没有动态链接库(.so),这样ffmpeg在默认的动态库找不到的情况下就会链接静态库。

最新的ffmpeg v0.11编译与链接
1. libfaac
  1. $cd faac-1.28
  2. $./configure --prefix=3RDLIB_INSTALL_PATH --enable-static --disable-shard
  3. $make
  4. $make install
2. libmp3lame
  1. $tar -zxvf lame-3.98.4.tar.gz
  2. $./configure --prefix=3RDLIB_INSTALL_PATH--enable-static --disable-shared
  3. $make
  4. $make install
3.libx264
  1. $git clone git://git.videolan.org/x264.git
  2. $cd x264
  3. $./configure --prefix=3RDLIB_INSTALL_PATH --enable-static
  4. $make
  5. $make install

for ffmpeg-v2.1.1
./configure --prefix=/opt/hkyan/pjt/ffmpeg/source_code/3rdlib_for_ffmpegV2.1.1 --enable-static --disable-opencl
4.librtmp
  1. $git clone git://git.ffmpeg.org/rtmpdump
  2. $cd rtmpdump
  3. $cd librtmp
修改Makefile文件

$vim Makefile
  1. #prefix=/usr/local
  2. prefix=3RDLIB_INSTALL_PATH
  3. ...
  4. #CRYPTO=OPENSSL
  5. CRYPTO=
  6. ...
  7. #SO_LDFLAGS_posix=-shared -Wl,-soname,$@
  8. SO_LDFLAGS_posix=-Wl,-soname,$@
  9. ...
  10. #SHARED=yes
  11. SHARED=no

  12. 保存并退出

  1. $make
  2. $cd ..
  3. $make SYS=darwin XDEF=-DNO_SSL CRYPTO= SHARED=
  4. $make install


5. ffmpeg配置
  1. $cd ffmpeg

  2. 修改configure文件
  3. $vim configure
  4. ...
  5. #enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
  6. enabled librtmp && { check_lib librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lwinmm -lws2_32 ||
  7.                         check_lib librtmp/rtmp.h RTMP_Socket -lrtmp -lssl -lcrypto -lz ||
  8.                                                 die "ERROR: librtmp not found or RTMP_Socket() missing, librtmp

  9. version must be >= 2.2.f"; }

  10. 保存并退出



  11. $./configure \
  12. --enable-gpl --enable-nonfree --enable-version3 \
  13. --disable-shared --enable-static \
  14. --enable-pthreads --enable-runtime-cpudetect \
  15. --enable-zlib --enable-bzlib \
  16. --enable-postproc \
  17. --extra-cflags='-I/3RDLIB_INSTALL_PATH/include -DREDIRECT_DEBUG_LOG' \
  18. --extra-ldflags='-L/3RDLIB_INSTALL_PATH/lib -gl' \
  19. --disable-encoder=aac \
  20. --enable-libfaac --enable-encoder=libfaac \
  21. --enable-libmp3lame --enable-encoder=libmp3lame \
  22. --enable-libx264 --enable-encoder=libx264 \
  23. --enable-avfilter --enable-filter=movie \
  24. --enable-librtmp

  25. $make
  26. $make install
编译ffmpeg以支持rtmp, librtmp not found问题

在mingw下编译ffmpeg,并加上对rtmp的支持,即要先编译librtmp. 编译过程出了个librtmp not found问题,
google了一圈,发现有很多类似的问题,但都和我的不完全一样。
我的根本问题是mingw下的pkg-config没有正确安装。
librtmp经过make和make install后,库文件和头文件都已经分别拷贝到/usr/local/lib和/usr/local/include目录下,
ffmpeg在configure时找不到librtmp,为什么找不到呢?
百思不得其解,无奈之下google,最终得到提示。

 

打开configure文件,发现下面一行

enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
原来ffmpeg通过pkg-config去找librtmp,难怪找不着了。

 

解决办法:

以#符号注释掉enabled librtmp一行

在configure时加上参数

./configure \

... ...

--extra-ldflags="-L/usr/local/lib" \

--extra-cflags="-I/usr/local/include" \

--extra-libs="-lrtmp" \

... ...


阅读(14722) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~