根據(jù)ffmpeg 生成android動態(tài)庫

根據(jù)ffmpeg 生成android動態(tài)庫
本次是在Ubuntu上進(jìn)行編譯ffmpeg庫的 安裝Ubuntu環(huán)境
1.安裝完Ubuntu之后 使用命令行執(zhí)行 依次以下命令:

        apt-get update
        apt-get install yasm
        apt-get install pkg-config

2.在Ubuntu中下載ndk 以及 ffmpeg (目前在ubuntu不要使用最新的ndk以及ffmpeg 會出現(xiàn)一些未知的環(huán)境錯誤)

    wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
    http://ffmpeg.org/releases/ffmpeg-3.4.5.tar.bz2

3.解壓 ndk 以及ffmpeg


image.png
 unzip android-ndk-r14b-linux-x86_64.zip  (比如解壓到/home/wxj/ndk_build/android-ndk-r14b)
   tar jxvf ffmpeg-3.4.5.tar.bz2      (比如解壓到/home/wxj/ffmpeg/ffmpeg-3.4.5)

可能需要配置ndk環(huán)境path。
4.修改ffmpeg解壓目錄中的 configure
使用vim 打開 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)'  

5.在ffmpeg-3.4.5目錄下新建android_build.sh腳本文件
vim android_build.sh
添加以下代碼:


            #!/bin/bash
        make clean
        export NDK=/home/wxj/ndk_build/android-ndk-r14b
        export SYSROOT=$NDK/platforms/android-21/arch-arm/
        export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
        export CPU=armv7-a
        export PREFIX=$(pwd)/android/$CPU
        export ADDI_CFLAGS="-marm"
        ./configure \
        --target-os=android \
        --arch=armv7-a \
        --enable-mediacodec \
        --enable-decoder=h264_mediacodec \
        --enable-jni \
        --enable-hwaccels \
        --prefix=$PREFIX \
        --disable-doc \
        --enable-shared \
        --disable-static \
        --disable-yasm \
        --disable-symver \
        --enable-gpl \
        --enable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
        make clean
        make
        make install
    

6.賦予腳本執(zhí)行權(quán)限:

     chmod +x android_build.sh

執(zhí)行腳本開始編譯:

    ./android_build.sh  

7.編譯成功后會在 /home/wxj/ffmpeg/ffmpeg-3.4.5目錄下生成一個android/armv7-a文件夾,里面有對應(yīng)的so庫(此時生成的so庫android還不能直接使用)


image.png

8.在ffmpeg-3.4.5目錄下新建androidbuild文件夾 將步驟7 生成的obj文件夾復(fù)制過來 劣欢,并且新建jni目錄


image.png

9.此步驟可以在as中完成 新建 FFmpegNative.java

 package com.sz.ffmlib;
                public class FFmpegNative {
            public static native void run();
        }

10.生成com_sz_ffmlib_FFmpegNative.h頭文件

            /* DO NOT EDIT THIS FILE - it is machine generated */
        #include <jni.h>
        /* Header for class com_sz_ffmlib_FFmpegNative */

        #ifndef _Included_com_sz_ffmlib_FFmpegNative
        #define _Included_com_sz_ffmlib_FFmpegNative
        #ifdef __cplusplus
        extern "C" {
        #endif
        /*
         * Class:     com_sz_ffmlib_FFmpegNative
         * Method:    run
         * Signature: ()V
         */
        JNIEXPORT void JNICALL Java_com_sz_ffmlib_FFmpegNative_run
          (JNIEnv *, jclass);

        #ifdef __cplusplus
        }
        #endif
        #endif

11.寫上Android.mk以及Application.mk
Android.mk:
```

            LOCAL_PATH:= $(call my-dir)
    INCLUDE_PATH:=/home/wxj/ffmpeg/ffmpeg-3.4.5/android/armv7-a/include
    FFMPEG_LIB_PATH:=/home/wxj/ffmpeg/ffmpeg-3.4.5/android/armv7-a/lib

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavcodec
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavcodec.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavformat
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavformat.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libswscale
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libswscale.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavutil
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavutil.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavfilter
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavfilter.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libswresample
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libswresample.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libpostproc
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libpostproc.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavdevice
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavdevice.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)

    include $(CLEAR_VARS)
    LOCAL_MODULE := ffmpeg
    LOCAL_SRC_FILES := com_sz_ffmlib_FFmpegNative.c
    LOCAL_C_INCLUDES := /home/wxj/ffmpeg/ffmpeg-3.4.5
    LOCAL_LDLIBS := -lm -llog
    LOCAL_SHARED_LIBRARIES := libavcodec libavfilter libavformat libavutil libswresample libswscale libavdevice
    include $(BUILD_SHARED_LIBRARY)
```

Application.mk:

        APP_ABI := armeabi-v7a
        APP_PLATFORM= android-14

12.實(shí)現(xiàn).h文件的具體邏輯 com_sz_ffmlib_FFmpegNative.c(測試)

        #include <android/log.h>
        #include "com_sz_ffmlib_FFmpegNative.h"

        #include <stdlib.h>
        #include <stdbool.h>
        #include <stdio.h>
        #include "libavcodec/avcodec.h"
        #include "libavformat/avformat.h"
        #include "libavfilter/avfilter.h"

        JNIEXPORT void JNICALL Java_com_sz_ffmlib_FFmpegNative_run(JNIEnv *env, jclass obj) {
          
            char info[40000] = {0};
            av_register_all();
            AVCodec *c_temp = av_codec_next(NULL);
            while(c_temp != NULL){
               if(c_temp->decode!=NULL){
                  sprintf(info,"%s[Dec]",info);
               }else{
                  sprintf(info,"%s[Enc]",info);
               }
               switch(c_temp->type){
                case AVMEDIA_TYPE_VIDEO:
                  sprintf(info,"%s[Video]",info);
                  break;
                case AVMEDIA_TYPE_AUDIO:
                  sprintf(info,"%s[Audio]",info);
                  break;
                default:
                  sprintf(info,"%s[Other]",info);
                  break;
               }
               sprintf(info,"%s[%10s]\n",info,c_temp->name);
               c_temp=c_temp->next;
            }
        __android_log_print(ANDROID_LOG_INFO,"myTag","info:\n%s",info);
        }
13.在jni 目錄下運(yùn)行ndk-build腳本命令就可以生成動態(tài)庫了 生成的動態(tài)庫在jni/libs/armeabi-v7a下
image.png
  14.將生成的so放到項(xiàng)目的jniLibs里面 
image.png

調(diào)用:


image.png
··
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末备恤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怠益,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季春,死亡現(xiàn)場離奇詭異,居然都是意外死亡消返,警方通過查閱死者的電腦和手機(jī)载弄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撵颊,“玉大人宇攻,你說我怎么就攤上這事〕拢” “怎么了逞刷?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我亲桥,道長洛心,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任题篷,我火速辦了婚禮词身,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘番枚。我一直安慰自己法严,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布葫笼。 她就那樣靜靜地躺著深啤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪路星。 梳的紋絲不亂的頭發(fā)上溯街,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機(jī)與錄音洋丐,去河邊找鬼呈昔。 笑死,一個胖子當(dāng)著我的面吹牛友绝,可吹牛的內(nèi)容都是我干的堤尾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼迁客,長吁一口氣:“原來是場噩夢啊……” “哼郭宝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掷漱,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤粘室,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后切威,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體育特,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年先朦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犬缨。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡喳魏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怀薛,到底是詐尸還是另有隱情刺彩,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站创倔,受9級特大地震影響嗡害,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畦攘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一霸妹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧知押,春花似錦叹螟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至静盅,卻和暖如春良价,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒿叠。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工棚壁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栈虚。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓袖外,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魂务。 傳聞我的和親對象是個殘疾皇子曼验,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361