在Linux環(huán)境下編譯Android下的最新版ffmpeg+x264單個(gè)動(dòng)態(tài)庫(kù)(.so)

最近在mac下用ndk交叉編譯最ffmpeg出問(wèn)題首有,總是顯示用系統(tǒng)的gcc而不是ndk的toolchain的交叉編譯gcc來(lái)編譯的贪嫂。之前明明沒(méi)問(wèn)題的胞皱,可能是由于最近升級(jí)macOS導(dǎo)致的舌界。由于對(duì)這方面實(shí)在沒(méi)太多經(jīng)驗(yàn),我試了下直接切到Android虛擬機(jī)下編譯忘蟹,編譯通過(guò)飒房。
記錄一下步驟

x264和ffmpeg的目錄平行放置,然后各自的腳本放在各自的文件夾里

1.編譯x264

x264好久沒(méi)更新了媚值,用最新的版本編譯即可

#!/bin/bash
NDK=$ANDROID_NDKPLATFORM=$NDK/platforms/android-8/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one{
./configure --prefix=$PREFIX \   
 --enable-static \    
--enable-shared \    
--enable-pic \    
--disable-asm \   
 --disable-cli \    
--host=arm-linux \    
--sysroot=$PLATFORM \    
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi-
make clean
make -j4
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

2.編譯ffmpeg

a.修改一下ffmpeg的configure:
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)'

參考:
http://linyehui.me/2014/05/09/how-to-build-ffmpeg-for-android-on-mac.html

b.腳本:
#!/bin/bash

# this is build file for linux
export NDK_9B="/vagrant_data/android-ndk-r9b"
echo "start building on linux..."

NDK=$NDK_9B
PLATFORM=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

X264_ANDROID=/vagrant_data/ffmpeg_build/yolo-ffmpeg-x264/x264/android

function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-static \
    --enable-shared \
    --disable-doc \
    --disable-asm \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$PLATFORM \
    --enable-encoder=aac \
    --enable-decoder=aac \
    --enable-encoders \
    --enable-decoder=h264 \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU/
ADDI_CFLAGS="-marm -I$X264_ANDROID/include"  # -DANDROID
ADDI_LDFLAGS="-L$X264_ANDROID/lib"
# build_one

echo ""
echo "arm-linux-androideabi-ar ing..."
$TOOLCHAIN/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o


echo ""
echo "arm-linux-androideabi-ld ing..."
$TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib \
        -L$PLATFORM/usr/lib \
        -L$PREFIX/lib \
        -L$X264_ANDROID/arm/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 \
        libswresample/libswresample.a \
        $X264_ANDROID/arm/lib/libx264.a \
        -lc -lm -lz -ldl -llog \
        --dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.8/libgcc.a

echo ""
echo "striping"

$TOOLCHAIN/bin/arm-linux-androideabi-strip --strip-unneeded $PREFIX/libffmpeg.so

echo ""
echo "strip over"

遇到的問(wèn)題:

1.text reallocation

這個(gè)在ffmpeg 2014.12.9號(hào)有一個(gè)commit修正了情屹,采用之后的版本即可
參考:http://stackoverflow.com/questions/34691970/ffmpeg-for-android-neon-build-has-text-relocations
x86的好像還是還有這個(gè)問(wèn)題,但是Android用的都是Arm架構(gòu)杂腰,我們就不多操心了

2.multiple definition

子問(wèn)題1

libavcodec/log2_tab.o: multiple definition of'ff_log2_tab'解決辦法
新增文件libavutil/log2_tab.h, 其內(nèi)容如下

#ifndef AV_LOG2TAB_H
#define AV_LOG2TAB_H

#include <stdint.h>
extern const uint8_t ff_log2_tab[256];

#endif

將所有報(bào)上述類似錯(cuò)誤的, 做如下修改

如:修改 libavcodec/log2_tab.c,將log2_tab.c改為log2_tab.h

// #include"libavutil/log2_tab.c"
#include "libavutil/log2_tab.h"
子問(wèn)題2

error: libavformat/golomb_tab.o: multipledefinition of 'ff_interleaved_dirac_golomb_vlc_code'解決方法

修改libavformat/golomb_tab.c, 如下:

// #include "libavcodec/golomb.c"
#include "libavcodec/golomb.h"
子問(wèn)題3

obj/local/armeabi-v7a/libavutil.a(reverse.o):multiple definition of 'ff_reverse'
/obj/local/armeabi-v7a/libavcodec.a(reverse.o):previous definition here 解決方法

新增文件libavutil/reverse.h, 其內(nèi)容如下

#ifndef AV_REVERSE_WR_H
#define AV_REVERSE_WR_H

#include <stdint.h>
extern const uint8_t ff_reverse[256];

#endif //AV_REVERSE_WR_H

將所有報(bào)上述類似錯(cuò)誤的椅文, 做如下修改

如:修改libavutil/reverse.c, reverse.reverse.h

// #include "libavutil/reverse.c"
#include "libavutil/reverse.h"
}
Note:

關(guān)于text reallocation喂很,網(wǎng)上有流傳的解法是加上--disable-asm,但是這種方法會(huì)給ffmpeg帶來(lái)非常嚴(yán)重的性能損失(網(wǎng)上這么說(shuō)的,我沒(méi)測(cè))皆刺,所以不要考慮這種方法少辣,而且貌似有人測(cè)過(guò)據(jù)說(shuō)也不一定能解決text reallocation的問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羡蛾,隨后出現(xiàn)的幾起案子漓帅,更是在濱河造成了極大的恐慌,老刑警劉巖痴怨,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忙干,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浪藻,警方通過(guò)查閱死者的電腦和手機(jī)捐迫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爱葵,“玉大人施戴,你說(shuō)我怎么就攤上這事∶日桑” “怎么了赞哗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辆雾。 經(jīng)常有香客問(wèn)我肪笋,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任涂乌,我火速辦了婚禮艺栈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湾盒。我一直安慰自己湿右,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布罚勾。 她就那樣靜靜地躺著毅人,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尖殃。 梳的紋絲不亂的頭發(fā)上丈莺,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音送丰,去河邊找鬼缔俄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛器躏,可吹牛的內(nèi)容都是我干的俐载。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼登失,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遏佣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起揽浙,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤状婶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后馅巷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體膛虫,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年钓猬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了走敌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逗噩,死狀恐怖掉丽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情异雁,我是刑警寧澤捶障,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站纲刀,受9級(jí)特大地震影響项炼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一锭部、第九天 我趴在偏房一處隱蔽的房頂上張望暂论。 院中可真熱鬧,春花似錦拌禾、人聲如沸取胎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闻蛀。三九已至,卻和暖如春您市,著一層夾襖步出監(jiān)牢的瞬間觉痛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工茵休, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薪棒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓榕莺,卻偏偏與公主長(zhǎng)得像盗尸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帽撑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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