No More Than Nothing

Mplayer的编译方法

| Comments

网上类似的文章数不胜数,并且有想法自己搞这些开源玩意儿的同学想必水平也应该都在我之上,我本不该多此一举。不过记得当初为了编译出一个能够完全胜任MPlayerX的核心,我还是费了相当一些周折,这些周折如果在网上仔细调查也能得到答案,不过将它们总结到一起的文章,我还没有发现。所以我就做一个搬运工,把它们放到一起供有兴趣的同学翻阅。

我会尽力在我水平之内照顾到这篇文章的通用性,但请恕我精力有限,如果有什么出错的地方请和我联系。

多点代码,少点废话。

  • 准备工具链

编译所需要的所有的工具,都可以通过安装Xcode得到。

  • 编译依赖库

    1. Fontconfig

    2. freetype2

    3. yasm

    4. libvpx

      • 功能:WebM解码模块。
      • 地址:http://code.google.com/p/webm/downloads/list
      • 编译方法:
          tar xvf libvpx-1.1.0.tar.bz2
          cd libvpx-1.1.0/
          ./configure --enable-vp8 --enable-postproc --enable-multithread --enable-spatial-resampling --disable-examples --disable-codec-srcs --disable-install-srcs --disable-install-docs --disable-debug --target=x86_64-darwin10-gcc
          make
          sudo make install 
        
    5. live555

    6. 其他以及注意事项

      • 编译流程比较简单,解压 → configure → make → sudo make install,需要注意的是 ./configure的选项。
      • 除了以上的以外,还有一些可选装的第三方库,如 FLAC, ogg, vorbis, speex 等等,编译方法都比较类似,这里就不一一列举了。
  • 编译mplayer

    1. 下载源代码

      1. mplayer
         git clone git://git.mplayerhq.hu/mplayer -b master mplayer
        
      2. ffmpeg
         git clone git://source.ffmpeg.org/ffmpeg.git -b master mplayer/ffmpeg
        
      3. libdvdnav
         git clone git://git.videolan.org/libdvdnav.git -b master libdvdnav
        
      4. libdvdread
         git clone git://git.videolan.org/libdvdread.git -b master libdvdread
        
      5. 制作 libdvdnav 和 libdvdread 的符号链接
         ln -s mplayer/libdvdnav libdvdnav/src
         ln -s mplayer/libdvdread4 libdvdread/src
        
    2. 编译

       cd mplayer
       export CC="clang"
       ./configure --codecsdir=codecs --disable-mencoder --disable-gui --disable-apple-remote  --disable-unrarexec  --disable-pnm --disable-tga --disable-md5sum --disable-quartz  --disable-openal --disable-jpeg --disable-png --disable-yuv4mpeg --disable-faac --disable-faad --disable-tv --disable-libdca --disable-liba52 --disable-libvorbis --disable-theora --disable-qtx --disable-gl --disable-matrixview --disable-x11 --disable-xv --enable-decoder=vda --extra-cflags="-mmacosx-version-min=10.6" --extra-ldflags="-mmacosx-version-min=10.6 -framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore" --enable-runtime-cpudetection
       make -j8
      
      现在你已经可以使用刚刚生成的mplayer了,祝贺你。试试看
       ./mplayer test.mp4
      
    3. 重定向动态链接库文件路径

      如果你只是自己用,那么以上的步骤就足够了,你可以离开这个网页。

      如果你将你做好的mplayer发给你的朋友,你会得到下面的错误。

       QZYMBP17:binaries NILTSH$ ./mplayer 
       dyld: Library not loaded: /usr/local/lib/libfreetype.6.dylib
         Referenced from: /Volumes/Work/MPX/src/MPlayerX/MPlayerX/binaries/./mplayer
         Reason: image not found
       Trace/BPT trap: 5
      

      mplayer使用了动态链接库来使用它需要的第三方代码。因此如果我们试图在没有编译安装这些第三方库的Mac中运行mplayer的话,将会得到以上的错误。

      • 那如何查看 某一个二进制文件会链接到哪些动态链接库呢?
          otool -L mplayer
        
        这个命令会输出mplayer所连接到的所有的库,包括系统默认的,所以一般我们可以用下面的命令。
          otool -L mplayer | grep local
        
        我们会得到如下的输出:
          /usr/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
          /usr/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
          /usr/local/lib/libspeex.1.dylib (compatibility version 7.0.0, current version 7.0.0)
        

      上面列出来的就是我们之前编译好的第三方库,因此我们不仅要将mplayer本身拷贝到对方的Mac,还要将上面列出的dylib拷贝到相应的位置(/usr/local/lib/)。

      这是一个可行的办法,但是我不推荐拷贝到/usr/local/lib,一是麻烦,二是他可能会带来文件污染。我推荐下面的方法:

      • 我们可以重定向动态链接库的路径

        Mac中有一款工具 install_name_tool 可以修改二进制文件中的动态链接库的路径,具体使用方法,例如如下:

          install_name_tool -change /usr/local/lib/libfreetype.6.dylib @executable_path/lib/libfreetype.6.dylib mplayer
        
        运行了上面的命令之后,当我们再次用 otool 查看 mplayer,会得到如下结果:
          QZYMBP17:binaries NILTSH$ otool -L mplayer
          ...
              @executable_path/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
          ...
        

        /usr/local/lib/libfreetype.6.dylib 被修改成了 @executable_path/lib/libfreetype.6.dylib,这意味着 mplayer 将从自己所在文件夹下的lib文件夹中去寻找libfreetype.dylib,而并非/usr/local/lib/。

      这样我们就可以将自己做好的二进制文件按照如下的文件夹结构打包发布:

       |-mplayer
       \-lib
         |-libfreetype.6.dylib
         |-libfontconfig.1.dylib
         \-libspeex.1.dylib
      

      大功告成!

      将上面的一系列修改写成脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

if [[ $# -lt 1 ]]; then
    echo "Usage: modify.sh FILE"
    exit 1
fi

otool -L $1 | grep local | cut -d'(' -f1 | sed -e 's/^[ \t]*//' | while read line
do
    newline=`echo ${line} | sed -e 's|/usr/local|@executable_path|'`
    install_name_tool -change ${line} ${newline} $1
done;

Comments