使用Android NDK编译m3u8-segmenter
1,准备文件,下载m3u8-segmenter.tar.gz和ffmpeg-snapshot.tar.bz2
2,搭建NDK编译系统,下载Android-ndk-r9b-linux-x86_64.tar.bz2
执行命令sudo chmod 777 /opt
然后把android-ndk-r9b-linux-x86_64.tar.bz2拷贝到/opt目录下面,然后解压缩
tar xvf android-ndk-r9b-linux-x86_64.tar.bz2
然后cd /opt/android-ndk-r9b/build/tools
./make-standalone-toolchain.sh --ndk-dir=../../ \
--install-dir=../../../android-toolchain/android-14 --platform=android-14 \
--toolchain=arm-linux-androideabi-4.8
这样将在/opt目录下安装一个独立编译的工具链/opt/android-toolchain目录
3,编译ffmpeg
因为m3u8_segmenter在编译过程中会使用到-lavformat -lavcodec -lavutil这三个库,而这三个库就是ffmpeg中的,所以我们必须先编译ffmpeg。
首先在$HOME下面建立segmenter的目录,然后把m3u8-segmenter.tar.gz和ffmpeg-snapshot.tar.bz2拷贝到该目录下,然后进入该目录,并且在该目录下建立一个build目录。
执行tar xvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
然后建立一个my_configure_ffmpeg.sh的文档
--------------一个my_configure_ffmpeg.sh start here-------------------------------
---------------------------------------------------------------------------------
export ARM_ROOT=/opt/android-ndk-r9b
export ARM_INC=$ARM_ROOT/platforms/android-8/arch-arm/usr/include/
export ARM_LIB=$ARM_ROOT/platforms/android-8/arch-arm/usr/lib/
export ARM_TOOL=/opt/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export ARM_LIBO=/opt/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8
export PATH=$ARM_TOOL/bin:$PATH
export ARM_PRE=arm-linux-androideabi
export LIB_INC=/home/zangcf/segmenter/build/include
export LIB_LIB=/home/zangcf/segmenter/build/lib
PKG_CONFIG_PATH=/home/zangcf/segmenter/build/lib/pkgconfig
./configure \
--target-os=linux \
--disable-yasm \
--arch=armv5te \
--enable-cross-compile \
--cc=$ARM_TOOL/bin/${ARM_PRE}-gcc \
--cross-prefix=$ARM_TOOL/bin/${ARM_PRE}- \
--extra-cflags=" -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -D ANDROID -Wa,--noexecstack -MMD -MP -I$LIB_INC -I$ARM_INC -std=gnu99" \
--enable-static \
--disable-shared --enable-gpl \
--disable-asm \
--prefix=/home/zangcf/segmenter/build \
--disable-amd3dnow --disable-amd3dnowext --disable-mmx --disable-sse --disable-ssse3 \
--extra-libs="-lc -lm -ldl -lgcc -lz " \
--extra-ldflags=" -L$LIB_LIB -Wl,-rpath-link=$LIB_LIB -nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o " \
-------------------------------------------------------------------------------
--------------一个my_configure_ffmpeg.sh end here-------------------------------
然后执行这个脚本./my_configure_ffmpeg.sh(如果不能执行,请sudo chmod u+x my_configure_ffmpeg.sh)
如果一切顺利的话,应该没有错误,如果出现nasm版本过低的话,那么需要安装yasm
这个简单,下载一个yasm-1.2.0.tar.gz,然手解压缩执行标准的./configure&&make&&sudo make install就可以了,这个应该是没有错误的。
上面的配置完之后,可以执行make&&make install.这个过程比较长,你需要耐心等待一会儿
4,编译m3u8_segmenter。
解压缩:tar xvf 3u8-segmenter.tar.gz
然后建立如下的配置脚本
--------------一个my_configure_m3u8.sh start here-------------------------------
---------------------------------------------------------------------------------
#!/bin/sh
export ARM_ROOT=/opt/android-ndk-r9b
export ARM_INC=/opt/android-ndk-r9b/platforms/android-14/arch-arm/usr/include/
export ARM_LIB=/opt/android-ndk-r9b/platforms/android-8/arch-arm/usr/lib/
export ARM_TOOL=/opt/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export ARM_LIBO=/opt/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8
export PATH=$ARM_TOOL/bin:$PATH
export ARM_PRE=arm-linux-androideabi
export LIB_INC=/home/zangcf/segmenter/build/include
export LIB_LIB=/home/zangcf/segmenter/build/lib
BUILD_PATH=/home/zangcf/segmenter/build
PKG_CONFIG_PATH=/home/zangcf/segmenter/build/lib/pkgconfig
CC_PATH=/opt/android-toolchain/android-14/bin/arm-linux-androideabi-gcc
CPP_PATH=/opt/android-toolchain/android-14/bin/arm-linux-androideabi-cpp
./configure \
--prefix=$BUILD_PATH \
--build=arm \
CC=$CC_PATH \
CPP=$CPP_PATH \
--host=arm-linux \
FFMPEG_CFLAGS="-I/home/zangcf/segmenter/ffmpeg" \
FFMPEG_LIBS="-L/home/zangcf/segmenter/ffmpeg/libavcodec -L/home/zangcf/segmenter/ffmpeg/libavformat -L/home/zangcf/segmenter/ffmpeg/libavutil -pthread -lavformat -lavcodec -lavutil -lm -lz" \
LDFLAGS="-L/home/zangcf/segmenter/build/lib -L/opt/android-ndk-r9b/platforms/android-8/arch-arm/usr/lib/ -L/opt/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8,-lpthread" \
CFLAGS="-lc -lm -ldl -lgcc -lz"
-------------------------------------------------------------------------------
--------------一个my_configure_m3u8.sh end here-------------------------------
然后执行这个脚本,应该没有错误,输出的最后信息是
checking for FFMPEG... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating tests/Makefile
config.status: executing depfiles commands
----------------------------------------------
如果不是这个信息,请检查脚本的目录对应是不是正确了。
然后执行make,会输出如下信息::
------------------------------------------------------------------------------------------------
m3u8_segmenter-m3u8-segmenter.o:m3u8-segmenter.c:function write_index_file: error: undefined reference to 'rpl_malloc'
m3u8_segmenter-m3u8-segmenter.o:m3u8-segmenter.c:function main: error: undefined reference to 'rpl_malloc'
m3u8_segmenter-m3u8-segmenter.o:m3u8-segmenter.c:function main: error: undefined reference to 'rpl_malloc'
m3u8_segmenter-m3u8-segmenter.o:m3u8-segmenter.c:function main: error: undefined reference to 'rpl_malloc'
collect2: error: ld returned 1 exit status
make[1]: *** [m3u8-segmenter] 错误 1
make[1]:正在离开目录 `/home/zangcf/segmenter/m3u8-segmenter'
make: *** [all-recursive] 错误 1
-------------------------------------------------------------------------------------------------
这个问题比较诡异,我还没有搞清楚怎么回事。
gedit Makefile,打开Makefile文件,找到“-Dmalloc=rpl_malloc”,然后删除它,接着make clean && make,编译就可以通过了。
然后执行make install,所需要的bin和库文件就在build下面生成了。