linux環(huán)境下編譯ffmpeg并集成到androidstudio中

第一步 下載FFmpeg源文件 2.6.9的版本

調(diào)用命令 wget http://ffmpeg.org/releases/ffmpeg-2.6.9.tar.gz

第二步 解壓ffmpeg壓縮包

tar -xzf ffmpeg-2.6.9.tar.gz

第三步 賦予權(quán)限ffmpeg-2.6.9文件夾可執(zhí)行權(quán)限

chmod 777 -R ffmpeg-2.6.9

xftp6軟件查看

第四步 調(diào)用配置build_android.sh腳本文件來(lái)運(yùn)行ffmpeg文件夾下的configure。

在configure文件 2775行
將該文件中的如下四行:

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)'

首先編寫build_android.sh腳本文件
創(chuàng)建腳本文件
vim build_android.sh
在build_android.sh文件中編寫如下代碼

#!/bin/bash
make clean
export NDK=/NDK/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-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

代碼中NDK變量是ndk的路徑。



PREFIX變量代表的是編譯生成的動(dòng)態(tài)庫(kù)存放的位置,即 當(dāng)前目錄/android/arm。


第五步 執(zhí)行build_android.sh編譯ffmpeg生成so庫(kù)

shell命令



編譯時(shí)間有點(diǎn)久可能會(huì)需要20分鐘左右。
編譯完成之后,我們會(huì)在android/arm目錄下看到include文件夾和libs文件夾,他們分別存放的是so庫(kù)對(duì)應(yīng)的頭文件和so動(dòng)態(tài)庫(kù)


第六步 將生成的android\arm\lib 下的八個(gè)so復(fù)制到 android工程的 libs\armeabi

libavcodec-56.so //編解碼
libavdevice-56.so //硬件采集、加速、顯示
libavformat-56.so //文件格式
libavutil-54.so //通用庫(kù)
libpostproc-53.so //同步、時(shí)間計(jì)算的簡(jiǎn)單算法
libswresample-1.so //原始音頻格式轉(zhuǎn)碼
libswscale-3.so //原始視頻格式轉(zhuǎn)換
libavfilter-5.so

然后將生成的android\arm\include里面的頭文件也復(fù)制到android工程的 libs\include



as工程

在 android studio 的 moudle 下的defaultConfig節(jié)點(diǎn)加入下面代碼

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}
externalNativeBuild {
    cmake {
        cppFlags "-frtti -fexceptions"
        abiFilters 'armeabi'
    }
}

第七步 配置androidstudio工程的CMakeLists.txt文件

代碼如下

cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp
              )

find_library( log-lib
              log )
include_directories(libs/include)
set(DIR ../../../../libs)
MESSAGE("打印")
MESSAGE("路徑  " ${DIR})
add_library(avcodec-56
            SHARED
            IMPORTED)
set_target_properties(avcodec-56
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi/libavcodec-56.so)
add_library(avdevice-56
            SHARED
            IMPORTED)
set_target_properties(avdevice-56
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi/libavdevice-56.so)
add_library(avformat-56
            SHARED
            IMPORTED)
set_target_properties(avformat-56
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi/libavformat-56.so)
add_library(avutil-54
            SHARED
            IMPORTED)
set_target_properties(avutil-54
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi/libavutil-54.so)
add_library(postproc-53
            SHARED
            IMPORTED)
set_target_properties(postproc-53
                      PROPERTIES IMPORTED_LOCATION
                      ${DIR}/armeabi/libpostproc-53.so)
 add_library(swresample-1
             SHARED
             IMPORTED)
 set_target_properties(swresample-1
                       PROPERTIES IMPORTED_LOCATION
                       ${DIR}/armeabi/libswresample-1.so)
  add_library(swscale-3
              SHARED
              IMPORTED)
  set_target_properties(swscale-3
                        PROPERTIES IMPORTED_LOCATION
                        ${DIR}/armeabi/libswscale-3.so)
  add_library(avfilter-5
              SHARED
              IMPORTED)
  set_target_properties(avfilter-5
                        PROPERTIES IMPORTED_LOCATION
                        ${DIR}/armeabi/libavfilter-5.so)
target_link_libraries( native-lib
                       avcodec-56
                       avdevice-56
                       avformat-56
                       avutil-54
                       postproc-53
                       swresample-1
                       swscale-3
                       ${log-lib} )

第八步 在java代碼中加載.so庫(kù)

static{

    System.loadLibrary("avcodec-56");
    System.loadLibrary("avdevice-56");
    System.loadLibrary("avfilter-5");
    System.loadLibrary("avformat-56");
    System.loadLibrary("avutil-54");
    System.loadLibrary("postproc-53");
    System.loadLibrary("swresample-1");
    System.loadLibrary("swscale-3");
    System.loadLibrary("native-lib");
}

以上步驟完成就能在android工程里面使用ffmpeg相關(guān)的動(dòng)態(tài)庫(kù)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容