linux下安装ffmpeg

来源:互联网 发布:不属于启发式搜索算法 编辑:程序博客网 时间:2024/05/12 06:05
Linux安装ffmpeg
现在安装文件
版本:ffmpeg 1.2.6
在 http://ffmpeg.org/download.html 页面选择“FFmpeg 1.2.6 Magic”,Magic是版本代号。
网站提供两种压缩方式,分别是bzip2和gzip格式。
# wget http://ffmpeg.org/releases/ffmpeg-1.2.6.tar.bz2
#wget http://ffmpeg.org/releases/ffmpeg-1.2.6.tar.gz 




Make工具下载3.8.2版本,公司虚拟机上的3.8版本低,支持不了ffmpeg的编译
下载地址: http://download.chinaunix.net/download.php?id=38958&ResourceID=6518


安装ffmpeg
先安装make-3.8.2
#./configure –prefix=~/software/make-3.8.2/ 注:公司虚机对/usr/bin没有写权限,只能安装到当前用户目录下的子目录。
#make && make install      注:安装make-3.8.2工具,也用make-3.8的工具执行。


覆盖原有低版本的3.8版本
在~/.bash_profile中,增加环境变量:
#PATH=~/software/make-3.8.2/bin:$PATH 注:~/software/make-3.8.2/bin放最前面,以高于/usr/bin的路径,这样执行make的时候才能先看到make-3.8.2
#export $PATH
#source ~/.bash_profile


安装ffmpeg
1、 不用安装ffplay播放器模块(configure时使用—disable-ffplay选项),因为ffplay依赖的libSDL搞不定。
2、 加--disable-mmx选项,不然JAVA调用可能会有问题。
3、 生成动态链接库(加--enable-shared选项),以便JAVA使用。
4、 当前用户对/usr/lib没有写权限,所以生成的动态链接库,没法拷贝到/usr/lib下,因此需要通过环境变量 LD_LIBRARY_PATH 定义。


#./configure --disable-ffplay --disable-mmx --enable-shared --prefix=~/software/ffmpeg/ffmpeg-installed
#make && make install
在~/.bash_profile中增加:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/software/ffmpeg/ffmpeg-installed/lib
export LD_LIBRARY_PATH
执行:source ~/.bash_profile 立即生效。


小结
安装 ffmpeg 总结:
1、选择 ffmpeg版本: version 1.2.6
2、只安装 ffmpeg执行文件,不用安装 ffplay播放器,因为ffplay依赖的libSDL处理不了 (原因至今未知)。configure时增加--disable-ffplay选项。
3、make编译工具选择3.8.2,公司虚机默认是3.8版本,自己现在3.8.2后,无法覆盖/usr/bin/make (因为没有权限),但是可以在~/.bash_profile重新定义PATH的搜索顺序,把自己的3.8.2的放在最前面。
4、安装指令:
  (1) ./configure --disable-ffplay --disable-mmx --enable-shared --prefix=~/software/ffmpeg/ffmpeg-installed
  (2) make
  (3) make install V=1     其中V=1显示详细日志
 (4)在~/.bash_profile增加:
        LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/software/ffmpeg/ffmpeg-installed/lib 
        export LD_LIBRARY_PATH
  (5)ffmpeg -version  验证安装
跌跌撞撞的过程
1、make 版本太低,升级到3.82
http://www.iteye.com/problems/77543


[@ ffmpeg-2.2.3]$ make
/usr/bin/make64 MAC=64
common.mak:18: *** unterminated call to function `foreach': missing `)'. Stop.


原因:make 版本太低,一般是3.8,需要升级到 3.8.2


2、/usr/bin 目录没有写权限,安装到 用户目录
./configure --disable-mmx --enable-shared --prefix=/home/users//software/ffmpeg/ffmpeg-installed
~/make && ~/make install    (其中: ~/make 软链到自己安装的 make-3.82 )


当前用户的环境变量设置在:~/.bash_profile 隐藏文件。或者 ~/.profile 文件
REFER: http://blog.csdn.net/ubuntu64fan/article/details/8289335 
[@ ~]$ more .bash_profile
# .bash_profile
# Get the aliases and functions 
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs 
JAVA_HOME=/java/jdk1.6.0_06


系统/usr/bin/java 版本是 1.4,当前用户需要安装1.6,但是当前用户对/usr/bin 没有写权限,如何当前用户如何覆盖系统的java ? 
回答:在~/.bash_profile中重新定义PATH变量。但是Linux命令搜索总是从/usr/bin 开始,而后才是 $PATH下的。
只能在运行java前,增加个~/java,同时把JAVA安装到~根目录。
实际上 PATH=/your/java/path/:$PATH  把自己的放在最前面就可以。


[@ software]$ pwd
/home/users//software
[@ software]$ java -version
java version "1.4.2"
gcj (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


在 ~/.bash_profile 中增加
PATH=$JAVA_HOME/bin:~/software/ffmpeg/make_3_82/make-3.82:$PATH:$HOME/bin:$JAVA_HOME/bin:$LSOF_HOME
source ~/.bash_profile




3、编译失败? =>不应该安装最新版本2.2.3版 2014-06-03才发布。
libavcodec/libavcodec.so: undefined reference to `ff_synth_filter_inner_sse2'
collect2: ld returned 1 exit status
make: *** [ffmpeg_g] Error 1


4、安装1.2.6版本也失败? 系统没有安装SDL,得先安装。
/home/users//software/ffmpeg/ffmpeg-1.2.6/ffplay.c:2288: undefined reference to `SDL_getenv'
ffplay.o(.text+0x85c8): In function `main':
/home/users//software/ffmpeg/ffmpeg-1.2.6/ffplay.c:3384: undefined reference to `SDL_putenv'
collect2: ld returned 1 exit status
make: *** [ffplay_g] Error 1


错误提示:在安装ffplay时,遇到“未定义”的函数'SDL_getenv'。REFER: 'undefined reference to ' http://blog.sina.com.cn/s/blog_605f5b4f010139i0.html 
(1)ffplay是ffmpeg包的播放器,如果我们仅仅是编解码,其实可以不用安装ffplay,可以在configure时,使用--disable-ffplay选项来 disable ffplay build。
        REFER: ./configure --help 提示可以不安装ffplay的。
(2)SDL_getenv是什么?SDL是一个开源的包,Simple DirectMedia Layer,一个自由的跨平台的多媒体开发包。在游戏开发,模拟器开发,和MPEG播放器都有广泛应用。例如网友利用SDL+ffmpeg进行播放器的开发:http://blog.csdn.net/ashlingr/article/details/7917699 。
(3)ffplay依赖第三方的多媒体开发包SDL,如果linux机器(我们是虚拟机)上没有SDL,那么自己安装个? 下载SDL包: wget http://www.libsdl.org/release/SDL-1.2.15.tar.gz
       然后在ffmpeg的make编译操作的时候,用-I DIRECTORY, --include-dir=DIRECTORY  ( Search DIRECTORY for included makefiles) 参数把SDL路径include进来。
      REFER:  http://blog.chinaunix.net/uid-23145525-id-3748261.html 
(4)尝试命令
     4.1 先安装SDL:  ./configure --prefix=~/software/SDL/installed  &&  make  && make install
     4.2 再安装ffmpeg: [--disable-yasm]   结论:安装了SDL后,还是报缺少SDL ???
            ./configure --disable-mmx --enable-shared   --prefix=~/software/ffmpeg/ffmpeg-installed  [--incdir=~/software/SDL/installed/include/SDL]
            ~/make -I ~/software/SDL/installed  或  ~/software/SDL/installed/include/SDL
            ~/make install
    
(5)放弃ffplay的安装:  结论: --disable-ffplay 则不仅不生成ffplay,连ffmpeg执行文件也无法生成。
            ./configure --disable-ffplay --disable-mmx --enable-shared   --prefix=~/software/ffmpeg/ffmpeg-installed 
        http://blog.chinaunix.net/uid-11344913-id-3936227.html


 (6)系统其实已经安装过SDL,是版本不对么?
网友说安装ffmpeg,没有生成 ffplay的原因几乎都跟SDL有关系,主要表现两方面:一个是没有安装SDL,另一个是SDL版本不对。
REFER:  http://blog.chinaunix.net/uid-11344913-id-3936227.html
排查1: 是否安装了 SDL ?  结论:已经安装1.2.7


[@ ~]$ sdl-config --version
1.2.7
[@ ~]$ which sdl-config
/usr/bin/sdl-config
[@ ~]$ 


安装完SDL,生成的头文件在: /usr/include/SDL/   目录下,打开 SDL_version.h 头文件,也有版本信息描述:
/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
*/
#define SDL_MAJOR_VERSION 1
#define SDL_MINOR_VERSION 2
#define SDL_PATCHLEVEL 7


排查2:版本是否正确?  检查 ffmpeg-1.2.6的configure BASH脚本,搜索 SDL_CONFIG字样   结论:1.2.7 是符合要求的。
3995 SDL_CONFIG="${cross_prefix}sdl-config"
3998 if check_pkg_config sdl SDL_events.h SDL_PollEvent; then 
3999 check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
                                        注意:对SDL的版本要求是 1.2.1 以上版本(含1.2.1)
4000 enable sdl &&
4001 check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
4002 else
4003 if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
4004 sdl_cflags=$("${SDL_CONFIG}" --cflags)      显示结果:-I/usr/include/SDL -D_REENTRANT
4005 sdl_libs=$("${SDL_CONFIG}" --libs)              显示结果:-L/usr/lib64 -lSDL -lpthread
4006 check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
4007 check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4008 enable sdl &&
4009 check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
4010 fi
4011 fi
4012 enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs


排查3:头文件里面是否包含SDL_putenv和SDL_getenv函数?
[@ SDL]$ grep 'SDL_putenv' *
SDL_getenv.h:extern DECLSPEC int SDLCALL SDL_putenv(const char *variable);
SDL_getenv.h:#define putenv(X) SDL_putenv(X)
[@ SDL]$ grep 'SDL_getenv' *
SDL_getenv.h:extern DECLSPEC char * SDLCALL SDL_getenv(const char *name);
SDL_getenv.h:#define getenv(X) SDL_getenv(X)
SDL.h:#include "SDL_getenv.h"
[@ SDL]$ pwd
/usr/include/SDL
[@ SDL]$ 


(7) 坚持 --disable-ffplay 再试试,并在 make install V=1  显示详细日志  结果:生成ffmpeg了
./configure --disable-ffplay --disable-mmx --enable-shared --prefix=/home/users//software/ffmpeg/ffmpeg-installed
~/make
~/make install V=1


结果生成 ffmpeg了,但是执行 ffmpeg --version的时候,却报告:
ffmpeg: error while loading shared libraries: libavdevice.so.54: cannot open shared object file: No such file or directory
但搜索./lib/libavdevice.so.54 的确是存在的呀,难道ffmpeg 不知道在哪搜索???
[@ ffmpeg-installed]$ pwd
/home/users//software/ffmpeg/ffmpeg-installed
[@ ffmpeg-installed]$ find . -name libavdevice.so.54
./lib/libavdevice.so.54
[@ ffmpeg-installed]$


REFER:  http://blog.csdn.net/vblittleboy/article/details/8488388 
Linux下动态链接库的搜索路径是由 /etc/ld.so.conf 下配置的,默认搜索:  (新增加的可以追加一行,比如 /urs/local/lib ,然后 ldconfig 命令重新加载动态链接库)
[@ ffmpeg-1.2.6]$ more /etc/ld.so.conf
include ld.so.conf.d/*.conf
/lib/rh80/lib
/lib/rh80/usr/lib
/lib/rh80/usr/local/lib
/lib/rh80/usr/X11R6/lib


另外一个问题,为什么运行ffmpeg需要加载动态链接库呢? 在--enable-shared基础上增加--enable-static  ???   结论:--enable-static 其实默认就是有的。
./configure --disable-ffplay --disable-mmx --enable-shared --enable-static --prefix=/home/users//software/ffmpeg/ffmpeg-installed




(1)sudo ~/make install  需要以管理员的身份执行安装,这样才能加入动态链接库中。
(2)Linux如何管理共享动态链接库?
                2.1 标准路径:/lib 和 /usr/lib
                2.2 非标准路径-方式1: 将路径加入 /etc/ld.so.conf 配置配置文件,然后执行  ldconfig 重新加载配置文件(实际ldconfig 的输出结果是/etc/ld.so.cache,共享的时候从这个缓存目录搜索,ldconfig是重新生成缓存)。
                2.3 非标准路径-方式2:环境变量 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib    export LD_LIBRARY_PATH,把这两个指令增加到“~/.bash_profile“中,可以source ~/.bash_profile及时生效。


终于安装好了:


[@ bin]$ ./ffmpeg -version
ffmpeg version 1.2.6
built on Jun 16 2014 18:26:09 with gcc 3.4.5 (GCC) 20051201 (Red Hat 3.4.5-2)
configuration: --disable-ffplay --disable-mmx --enable-shared --enable-static --prefix=/home/users//software/ffmpeg/ffmpeg-installed
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102




安装 ffmpeg 总结:
1、选择 ffmpeg版本: version 1.2.6
2、只安装 ffmpeg执行文件,不用安装 ffplay播放器,因为ffplay依赖的libSDL处理不了 (原因至今未知)。configure时增加--disable-ffplay选项。
3、make编译工具选择3.8.2,公司虚机默认是3.8版本,自己现在3.8.2后,无法覆盖/usr/bin/make (因为没有权限),但是可以在~/.bash_profile重新定义PATH的搜索顺序,把自己的3.8.2的放在最前面。
4、安装指令:
  (1) ./configure --disable-ffplay --disable-mmx --enable-shared --prefix=~/software/ffmpeg/ffmpeg-installed
  (2) make
  (3) make install V=1     其中V=1显示详细日志
 (4)在~/.bash_profile增加:
        LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/software/ffmpeg/ffmpeg-installed/lib
        export LD_LIBRARY_PATH
  (5)ffmpeg -version  验证安装




________________________________________


http://linuxers.org/tutorial/how-install-ffmpeg-linux




Install FFmpeg in any Linux system from source
This howto will be helpful to all the linuxers who either want to have a fully customized installation of FFmpeg or are having some trouble in installing the default package from the distro repos or want to try the latest release.
First of all you will have to download the latest source from the main website. Now, untar it.
[shredder12]$ tar -xvjf ffmpeg-0.5.tar.bz2
Install FFmpeg with default options
once you are done with this, in order to install FFmpeg with the default config and options run
[shredder12]$ ./configure
from within the FFmpeg source directory. When the configuration script finishes compile it by running make
[shredder12]$ make
If the compile finishes without any errors run 'make install' as root to install FFmpeg
[shredder12]$ su -c 'make install'


附录:
tar jxvf ffmpeg-0.8.15.tar.bz2  
tar zxvf ffmpeg-1.2.6.tar.gz 
0 0
原创粉丝点击