手動(dòng)編譯FFmpeg靜態(tài)庫(kù)詳細(xì)過程

前言:

編譯FFmpeg用作二次開發(fā)音視頻泣崩,得提前安裝好Ubutu!!!

Step1:到ffmpeg官網(wǎng)上下載安裝包(Version:V4.1)

wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2

Step2:解壓下載好的安裝包

tar xvf ffmpeg-4.1.tar.bz2

解壓出來后進(jìn)入ffmpeg解壓目錄,可以看到里面有各種文件、文檔。需要關(guān)注的是configure文件翰萨。這個(gè)文件本身就是一個(gè)shell腳本宇攻,作用為生成makfile文件型雳,然后使用make執(zhí)行。

Step3:ffmpeg交叉編譯

#!/bin/bash
#這里定義變量挤茄,后續(xù)會(huì)使用
#TOOLCHAIN 變量指向ndk中的交叉編譯gcc所在的目錄
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
#FLAGS與INCLUDES變量 可以從AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷貝如叼,需要注意的是**地址**
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0 -fPIC"
INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"

#此變量用于編譯完成之后的庫(kù)與頭文件存放在哪個(gè)目錄
PREFIX=./android/armeabi-v7a2

#執(zhí)行configure腳本,用于生成makefile
#--prefix : 安裝目錄
#--enable-small : 優(yōu)化大小
#--disable-programs : 不編譯ffmpeg程序(命令行工具)穷劈,我們是需要獲得靜態(tài)(動(dòng)態(tài))庫(kù)薇正。
#--disable-avdevice : 關(guān)閉avdevice模塊,此模塊在android中無(wú)用
#--disable-encoders : 關(guān)閉所有編碼器 (播放不需要編碼)
#--disable-muxers :  關(guān)閉所有復(fù)用器(封裝器)囚衔,不需要生成mp4這樣的文件挖腰,所以關(guān)閉
#--disable-filters :關(guān)閉視頻濾鏡
#--enable-cross-compile : 開啟交叉編譯(ffmpeg比較**跨平臺(tái)**,并不是所有庫(kù)都有這么happy的選項(xiàng) )
#--cross-prefix: 看右邊的值應(yīng)該就知道是干嘛的,gcc的前綴 xxx/xxx/xxx-gcc 則給xxx/xxx/xxx-
#disable-shared enable-static 不寫也可以练湿,默認(rèn)就是這樣的猴仑。
#--sysroot: 
#--extra-cflags: 會(huì)傳給gcc的參數(shù)
#--arch --target-os : 不給不行
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot" \
--arch=arm \
--target-os=android 

#上面運(yùn)行腳本生成makefile之后,使用make執(zhí)行腳本
make clean
make install

Step4:打包編譯好的靜態(tài)庫(kù)和頭文件并導(dǎo)出來

1、進(jìn)入./android/armeabi-v7a2目錄
2辽俗、打包編譯好的文件

tar cvf ffmpeg.tar *

3疾渣、導(dǎo)出打包好的的tar包(導(dǎo)出保存在桌面)

sz ffmpeg.tar

4、解壓之后


image.png

Step5:通過AS創(chuàng)建一個(gè)NDK的項(xiàng)目

Step6:配置CMakelists.txt

cmake_minimum_required(VERSION 3.4.1)


add_library(
             native-lib
             
             SHARED

             src/main/cpp/native-lib.cpp )


#添加頭文件查找路徑
include_directories(src/main/cpp/include)

#配置預(yù)編譯編?kù)o態(tài)庫(kù)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/cpp/libs/${ANDROID_ABI}")



target_link_libraries(
                       native-lib

                       avcodec avfilter avformat avutil swresample swscale
                       
                       log )

Step7:配置grade

    defaultConfig {
        applicationId "com.cd.empsun.demo1"
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
                //加入這句
                abiFilters "armeabi-v7a"
            }
        }
    }

Step8:使用

#include <jni.h>
#include <string>
extern "C"{
#include <libavcodec/avcodec.h>
}
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_cd_empsun_demo1_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(av_version_info());
}

Step9:測(cè)試結(jié)果

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崖飘,一起剝皮案震驚了整個(gè)濱河市榴捡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朱浴,老刑警劉巖吊圾,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翰蠢,居然都是意外死亡项乒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門梁沧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檀何,“玉大人,你說我怎么就攤上這事廷支∑导” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵恋拍,是天一觀的道長(zhǎng)砚殿。 經(jīng)常有香客問我,道長(zhǎng)芝囤,這世上最難降的妖魔是什么似炎? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮悯姊,結(jié)果婚禮上羡藐,老公的妹妹穿的比我還像新娘。我一直安慰自己悯许,他們只是感情好仆嗦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著先壕,像睡著了一般瘩扼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垃僚,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天集绰,我揣著相機(jī)與錄音,去河邊找鬼谆棺。 笑死栽燕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碍岔,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浴讯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蔼啦?” 一聲冷哼從身側(cè)響起榆纽,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捏肢,沒想到半個(gè)月后奈籽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猛计,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年唠摹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爆捞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奉瘤。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煮甥,靈堂內(nèi)的尸體忽然破棺而出盗温,到底是詐尸還是另有隱情,我是刑警寧澤成肘,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布卖局,位于F島的核電站,受9級(jí)特大地震影響双霍,放射性物質(zhì)發(fā)生泄漏砚偶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一洒闸、第九天 我趴在偏房一處隱蔽的房頂上張望染坯。 院中可真熱鬧,春花似錦丘逸、人聲如沸单鹿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仲锄。三九已至,卻和暖如春湃鹊,著一層夾襖步出監(jiān)牢的瞬間儒喊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工币呵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澄惊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掸驱,于是被迫代替她去往敵國(guó)和親肛搬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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