anroid ndk編譯ffmpeg 引用librtmp libx264


     Ffmpeg 無處不在,自然android系統少不了它,折騰了不少時間完成 ndk編譯ffmpeg,生成so庫中引用了外部庫librtmp,libx264。條條大路通羅馬,

也許還有別的更好的方法去完成它,我沒有仔細研究。我使用的方法完全可以達到我的預期目的。

一.選擇編譯環境

   可以選擇windows下cygwin,也可以選擇linux系統,我建議選擇后者。花了很多時間在cygwin下編譯,configure時總是提示鏈接需要的so文件找不到。無奈

之下轉到linux環境下編譯。我用的版本是ubuntu16.04。編譯android版本的ffmpeg注意注意的地方有三個:一是configure時帶入的參數,二是放置將要用

到的第三方庫(so),最后一個是修改configure文件。下面聽我一一道來。

一. 創建一個shell腳本文件build_ffmpeg.sh用來引入configure參數,這個文件的格式是unix,如果文件是dos格式,可以用uedit轉換格式。

     創建的shell腳本內容如下:

  

#!/bin/sh
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
NDK=/home/wgg/wgg/android-ndk-r11c
SYSROOT=$NDK/platforms/android-21/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
./configure \
    --prefix=$PREFIX \
    --target-os=linux \
    --enable-cross-compile \
    --enable-runtime-cpudetect \
    --disable-asm \
    --arch=arm \
    --enable-nonfree \
    --enable-shared \
    --enable-version3 \
    --enable-gpl \
    --disable-programs \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --enable-avresample \
    --disable-everything \
    --enable-decoder=pcm_alaw \
    --enable-decoder=pcm_mulaw \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-encoder=aac \
    --enable-librtmp \
    --enable-libx264 \
    --enable-parser=aac \
    --enable-parser=h264 \
    --enable-parser=mpeg4video \
    --enable-parser=mpegvideo \
    --enable-parser=mpegaudio \
    --enable-encoder=libx264 \
    --enable-muxer=mpegts \
    --enable-muxer=flv \
    --enable-muxer=h264 \
    --enable-muxer=flv \
    --enable-muxer=mp4 \
    --enable-muxer=data \
    --enable-muxer=avi \
    --enable-muxer=mpeg2video \
    --enable-muxer=pcm_alaw \
    --enable-muxer=pcm_mulaw \
    --enable-demuxer=flv \
    --enable-demuxer=mpegts \
    --enable-demuxer=rtsp \
    --enable-protocol=httpproxy \
    --enable-protocol=crypto \
    --enable-protocol=ftp\
    --enable-protocol=unix\
    --enable-protocol=pipe \
    --enable-protocol=data \
    --enable-protocol=file \
    --enable-protocol=tcp \
    --enable-protocol=http \
    --enable-protocol=udp \
    --enable-protocol=udplite \
    --enable-protocol=rtp \
    --enable-protocol=librtmp \
    --enable-protocol=librtmpe \
    --enable-protocol=librtmps \
    --enable-protocol=librtmpt \
    --enable-protocol=librtmpte \
    --enable-protocol=async \
    --enable-protocol=md5 \
    --enable-protocol=cache \
    --enable-protocol=mmst \
    --enable-protocol=mmsh \
    --sysroot=$SYSROOT \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --enable-hwaccels \
    --enable-zlib \
    --disable-devices \
    --disable-avdevice \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-cflags="-I/home/wgg/wgg/ffmpeg/extern/include" \
       --extra-ldflags="-L/home/wgg/wgg/ffmpeg/extern/lib"

 NDK指定NDK包路徑,SYSROOT是路徑前綴,編譯是編譯器會去系統路徑下(例如/usr/lib,/lib),定義了SYSROOT以后編譯原系統路徑前加上$SYSROOT,表達式

中android-21要根據實際android重新設定。configure 選項可以根據需要自行刪減。--extra-cflags="-I/home/wgg/wgg/ffmpeg/extern/include" 指示外部庫的頭文件絕對路徑,--extra-ldflags="-L/home/wgg/wgg/ffmpeg/extern/lib" 指示外部so庫路徑。

二. 放置外部庫及頭文件

     將librtmp.so  libx264 libcrypto.so libssl.so 后兩個庫是第一個庫的依賴庫放在/home/wgg/wgg/ffmpeg/extern/lib下面。將x264.h, x264_config.h以及rtmp文件夾放在/home/wgg/wgg/ffmpeg/extern/include目錄下,rtmp文件夾中文件如下。

三.修改配置文件

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME

替換為

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
enabled librtmp  && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket

 修改成

enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp

  將

enabled libx264           && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode ||
                               { require libx264 x264.h x264_encoder_encode -lx264 &&
                                 warn "using libx264 without pkg-config"; } } &&
                             { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                               die "ERROR: libx264 must be installed and version must be >= 0.118."; } &&
                             { check_cpp_condition x264.h "X264_MPEG2" &&
                               enable libx262; }

  

替換為

enabled libx264  && require libx264 x264.h x264_encoder_encode -lx264

  修改build_ffmpeg.sh權限 chmod +x build_ffmpeg.sh

    OK,所有的准備工作都做好了。首先./build_ffmpeg.sh,接着make 最后 make install.

    注意:我這里用的ffmepg版本是3.0.2,librtmp,libx264基本不用改動,直接引用so不用再去編譯了。獲取外部引用庫請加入QQ群

     流媒體/Ffmpeg/音視頻 127903734。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM