歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

使用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下面生成了。

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved