ubuntu 下編譯FFmpeg以及Android開發(fā)環(huán)境的搭建

一匙瘪,開發(fā)環(huán)境的搭建

1.安裝ubuntu系統(tǒng),我這里演示的是ubuntu_16.04_LTS赞哗。

注意:[ubuntu14.04交叉編譯ffmpeg出現(xiàn)unable to create an executable file. C compiler test failed.]

解決:我64位ubuntu是新裝的,都還沒安裝32位的兼容庫,于是:
sudo apt-get install ia32-libs
坑又來了8胨亍!亦鳞!

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package ia32-libs is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
  lib32ncurses5 lib32z1

E: Package 'ia32-libs' has no installation candidate

已經(jīng)被其他的包給替代了付鹿。。蚜迅。
重新開刷:

sudo apt-get update
sudo apt-get -y upgrade
apt-get -y install gcc g++ make cmake curl  libcurl3 libcurl3-dev bzip2 pkg-config

OK舵匾!

2.進(jìn)入Home目錄下面(圖形界面非命令控制臺),按Ctrl+H谁不,就可以看到影藏的一些文件了坐梯。
3.找到.bashrc文件,直接打開刹帕。
4.修改.bashrc文件吵血,在最末尾加入下面內(nèi)容:(當(dāng)然前提是你已經(jīng)安裝了相應(yīng)的環(huán)境)

export JAVA_HOME=/home/chinese-boy/Android/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export ANDROID_NDK=/home/chinese-boy/Android/android-ndk-r10e
export ANDROID_SDK=/home/chinese-boy/Android/Sdk
export PATH=${JAVA_HOME}/bin:$ANDROID_NDK:$PATH

5.這樣一個android NDK開發(fā)環(huán)境基本上就配置完成了。

二偷溺,開始編譯ffmpeg

1.到官網(wǎng)下載最新的ffmepg源碼蹋辅,解壓到/home/Android/ffmpeg3.2/目錄下面,最好chmod u+x 一下
2.開始編寫build_android.sh shell腳本:內(nèi)容如下:

#!/bin/bash  
NDK=/home/chinese-boy/Android/android-ndk-r10e 
SYSROOT=$NDK/platforms/android-8/arch-arm/  
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64  

function build_one
{  
    ./configure \
    --prefix=$PREFIX \
    --disable-shared \
    --enable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --enable-small \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
}  

CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one 

注意:

1../configure 后面的配置可以根據(jù)自己的需要來填寫挫掏,其他基本都是固定格式了

2.如果是直接copy上面的shell腳本侦另,可能會是dos格式,請使用dos2unix build_android.sh 轉(zhuǎn)換一下,刪掉多余空格(這一點非常重要褒傅,我就掉坑里面了弃锐,報錯各種命令找不到各種路徑找不到之類的,哎5钔小E铡!Vе瘛Pⅰ!礼搁!)

dos2unix 是一個工具柳洋,如果沒有安裝的話請先安裝一下:sudo apt-get install dos2unix ,很快就完事叹坦。
下面貼一段報錯信息:

./build_android.sh: line 18: --enable-shared: command not found
./build_android.sh: line 20: --disable-static: command not found
./build_android.sh: line 22: --disable-doc: command not found
./build_android.sh: line 24: --disable-ffmpeg: command not found
./build_android.sh: line 26: --disable-ffplay: command not found
./build_android.sh: line 28: --disable-ffprobe: command not found
./build_android.sh: line 30: --disable-ffserver: command not found
./build_android.sh: line 32: --disable-avdevice: command not found

再來一段大神的shell腳本熊镣,基本夠了:

#!/bin/bash
######################################################
# Usage:
# put this script in top of FFmpeg source tree
# ./build_android
# It generates binary for following architectures:
# ARMv6 
# ARMv6+VFP 
# ARMv7+VFPv3-d16 (Tegra2) 
# ARMv7+Neon (Cortex-A8)
# Customizing:
# 1. Feel free to change ./configure parameters for more features
# 2. To adapt other ARM variants
# set $CPU and $OPTIMIZE_CFLAGS 
# call build_one
######################################################
NDK=../..
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=arm \
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
    --disable-shared \
    --enable-static \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
    --disable-everything \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --disable-ffplay \
    --enable-protocol=file \
    --enable-avformat \
    --enable-avcodec \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-parser=h264 \
    --disable-network \
    --enable-zlib \
    --disable-avfilter \
    --disable-avdevice \
    $ADDITIONAL_CONFIGURE_FLAG

make clean
make  -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.8/libgcc.a
}

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one

#arm v7vfp
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#PREFIX=./android/$CPU-vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

3.增加執(zhí)行權(quán)限,執(zhí)行:
$chmod a+x build_android.sh
$./build_android.sh
生成:[頭文件]android/arm/include/.h 和  [靜態(tài)庫文件]android/arm/lib/.a

三.接下來就是拿來主義了募书,開始Android應(yīng)用之旅:

1.copy后的目錄結(jié)構(gòu)如下:

Paste_Image.png

2.android.mk如下:(如果是動態(tài)庫的話绪囱,PREBUILT_SHARED_LIBRARY,LOCAL_SHARED_LIBRARIES莹捡,.a -》.so)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libavcodec 
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libavformat 
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libavutil 
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libswresample 
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libswscale 
LOCAL_SRC_FILES := prebuilt/lib/$(TARGET_ARCH_ABI)/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)


# build jni
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := ffmpeg.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/prebuilt/include
LOCAL_LDLIBS := -llog -lz
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libswscale libswresample libavutil     
include $(BUILD_SHARED_LIBRARY)

3.android.mk如下:

#APP_ABI := all
#APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64
APP_ABI := armeabi

4.其中ffmpeg.cpp就是你自己要寫的jni代碼了鬼吵。
5.完畢總結(jié):文章一定要仔細(xì)看,中間的坑還是很多的篮赢。
http://blog.csdn.net/chengkaizone/article/details/52983495
http://blog.csdn.net/u011485531/article/details/55804380
http://www.cnblogs.com/wainiwann/p/6223342.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齿椅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子启泣,更是在濱河造成了極大的恐慌涣脚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寥茫,死亡現(xiàn)場離奇詭異遣蚀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纱耻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門芭梯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弄喘,你說我怎么就攤上這事玖喘。” “怎么了蘑志?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵累奈,是天一觀的道長贬派。 經(jīng)常有香客問我,道長费尽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任羊始,我火速辦了婚禮旱幼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘突委。我一直安慰自己柏卤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布匀油。 她就那樣靜靜地躺著缘缚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敌蚜。 梳的紋絲不亂的頭發(fā)上桥滨,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音弛车,去河邊找鬼齐媒。 笑死,一個胖子當(dāng)著我的面吹牛纷跛,可吹牛的內(nèi)容都是我干的喻括。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贫奠,長吁一口氣:“原來是場噩夢啊……” “哼唬血!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唤崭,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拷恨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谢肾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挑随,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年勒叠,在試婚紗的時候發(fā)現(xiàn)自己被綠了兜挨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡眯分,死狀恐怖拌汇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弊决,我是刑警寧澤噪舀,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布魁淳,位于F島的核電站,受9級特大地震影響与倡,放射性物質(zhì)發(fā)生泄漏界逛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一纺座、第九天 我趴在偏房一處隱蔽的房頂上張望息拜。 院中可真熱鬧,春花似錦净响、人聲如沸少欺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞别。三九已至,卻和暖如春配乓,著一層夾襖步出監(jiān)牢的瞬間仿滔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工犹芹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留堤撵,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓羽莺,卻偏偏與公主長得像实昨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盐固,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容