网上类似的文章数不胜数,并且有想法自己搞这些开源玩意儿的同学想必水平也应该都在我之上,我本不该多此一举。不过记得当初为了编译出一个能够完全胜任MPlayerX的核心,我还是费了相当一些周折,这些周折如果在网上仔细调查也能得到答案,不过将它们总结到一起的文章,我还没有发现。所以我就做一个搬运工,把它们放到一起供有兴趣的同学翻阅。
我会尽力在我水平之内照顾到这篇文章的通用性,但请恕我精力有限,如果有什么出错的地方请和我联系。
多点代码,少点废话。
准备工具链
编译所需要的所有的工具,都可以通过安装Xcode得到。
编译依赖库
Fontconfig
- 功能:用于 支持MKV格式的内嵌字体。
- 地址:http://www.freedesktop.org/software/fontconfig/release/
- 编译方法:
tar xvf fontconfig-2.10.92.tar.bz2 cd fontconfig-2.10.92 ./configure make sudo make install
freetype2
- 功能:用于 字幕和OSD的文字显示。
- 地址:http://sourceforge.net/projects/freetype/files/freetype2/
- 编译方法:
tar xvf freetype-2.4.11.tar.bz2 cd freetype-2.4.11/ ./configure make sudo make install
yasm
- 功能:用于编译 libvpx。
- 地址:http://yasm.tortall.net/Download.html
- 编译方法:
tar xvf yasm-1.2.0.tar.gz cd yasm-1.2.0 ./configure make sudo make install
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
live555
- 功能:该模块可以让mplayer通过http协议传输rtsp协议的内容。
- 地址:http://www.live555.com/liveMedia/public/live555-latest.tar.gz
- 编译方法:
tar xvf live555-latest.tar.gz cd live ./genMakefiles macosx make sudo make install
其他以及注意事项
编译mplayer
下载源代码
- mplayer
git clone git://git.mplayerhq.hu/mplayer -b master mplayer
- ffmpeg
git clone git://source.ffmpeg.org/ffmpeg.git -b master mplayer/ffmpeg
- libdvdnav
git clone git://git.videolan.org/libdvdnav.git -b master libdvdnav
- libdvdread
git clone git://git.videolan.org/libdvdread.git -b master libdvdread
- 制作 libdvdnav 和 libdvdread 的符号链接
ln -s mplayer/libdvdnav libdvdnav/src ln -s mplayer/libdvdread4 libdvdread/src
- mplayer
编译
现在你已经可以使用刚刚生成的mplayer了,祝贺你。试试看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 test.mp4
重定向动态链接库文件路径
如果你只是自己用,那么以上的步骤就足够了,你可以离开这个网页。
如果你将你做好的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的话,将会得到以上的错误。
- 那如何查看 某一个二进制文件会链接到哪些动态链接库呢?
这个命令会输出mplayer所连接到的所有的库,包括系统默认的,所以一般我们可以用下面的命令。otool -L 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 可以修改二进制文件中的动态链接库的路径,具体使用方法,例如如下:
运行了上面的命令之后,当我们再次用 otool 查看 mplayer,会得到如下结果:install_name_tool -change /usr/local/lib/libfreetype.6.dylib @executable_path/lib/libfreetype.6.dylib 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 |
|