1. 程式人生 > >window環境下使用ndk編譯出android studio/Eclipse能使用的ffmpeg動態庫

window環境下使用ndk編譯出android studio/Eclipse能使用的ffmpeg動態庫

window環境下使用ndk編譯出android studio 能使用的ffmpeg動態庫

目錄

ffmepg介紹

FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec。–來至百度百科

對於一些不熟悉Linux系統的開發者來說,本文將帶領你們來使用window作業系統來編輯ffmepg動態,來為我們的android studio使用(或者Eclipse)

環境準備

ndk環境搭建

1.android studio通過sdk Manager/SDK TOOls分類下,NDK直接下載,
下載ndk


次方法下載完的路徑在android Manager下載目錄Android sdk目錄下的ndk-bundle中

2.離線下載方式,解壓到一個地址即可

接下來環境變數配置
ndk環境變數配置

安裝minGW軟體,並配置它的環境變數

安裝過程

安裝地址

接下來進入下載管理器過程,類似android Manager的工具
這裡寫圖片描述

接下來進入選擇安裝模組的介面,需要安裝紅色框選擇的兩個模組
這裡寫圖片描述
安裝方法是右鍵要安裝的模組->下拉選擇框中選擇“Mark for instatllation->選擇選單欄“Installation->點選選擇Apply changes項
會調整到這個介面,apply即可
這裡寫圖片描述

環境變數配置

配置minGW安裝目錄下的bin到環境變數
這裡寫圖片描述

編譯ffmpeg

原始碼下

編譯檔案配置

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

增加build_android.sh檔案

其中NDK,SYSROOT,TOOLCHAIN是你需要更加本地環境情況需要配置的

 #!/bin/bash 
NDK=你對應的ndk目錄 
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64
function build_one { 
./configure \
     --prefix=$PREFIX \
     --enable-shared \
     --disable-static \
     --disable-doc \
     --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=$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

我的配置是

NDK=C:/WorkSoftwear/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

開始編譯

安裝Mingw成功後,雙擊目錄MinGW/msys/1.0/msys.bat批處理檔案,然後輸入命令cd 你的目錄 進入對應的ffmpeg根目錄下(即進入到build.android.sh所在目錄下)後輸入./build_android.sh進行編譯,大概十幾分鐘左右。(途中會有一些warning,和deprecated api,不會影響結果)。
這裡寫圖片描述
第一條命令錯誤是因為linux下資料夾分隔符“/”和window下是相反,複製過來的路徑需要修改,結束之後可以看到在ffmpeg資料夾下面多了一個android資料夾

如果是eclipse使用,那麼你需要一個Android.mk檔案,android studio忽略

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-3.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-54.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-5.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample-1.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)