AndroidNDK工程FFmpeg(一)-- Android使用FFmpeg--Shell腳本編寫與執行編譯FFmpeg庫

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計 算機程序。FFmpeg
是一個多媒體視頻處理工具,有非常強大的功能包括視頻採集功能、
視頻格式轉換、視頻抓圖、給視頻加水印等。FFmpeg是由C代碼編寫而成,功能多,代碼量大。

AndroidNDK工程FFmpeg(一)–Mac下編譯 Android使用FFmpeg–Shell腳本編寫與執行編譯FFmpeg庫

AndroidNDK工程FFmpeg(二)–AndroidStudio下創建FFmpeg的NDK工程

AndroidNDK工程FFmpeg(三)–FFmpeg API簡介

AndroidNDK工程FFmpeg(四)–FFmpeg視頻解碼之視頻播放器

以上呢是百度百科上的,事實上,FFmpeg的視音頻編解碼功能確實太強大了,幾乎囊括了現存所有的視音頻編碼標準,因此只要做視音頻開發,幾乎離不開它。市面上主流的播放器(暴風影音)、直播軟件、視頻轉化工具(格式工廠),小視頻軟件等幾乎都是由FFmpeg來做支持的。FFmpeg是由C語言開發的,支持各種平臺,我作爲一個Android開發,其他的就不提了,也不會我們就來看看Android下是怎麼使用FFmpeg的。

在Android平臺使用需要先編譯,後使用,編譯可以通過MakeFile語法來進行編 譯。

一、首先下載FFmpeg

下載地址: http://ffmpeg.org/download.html
我們下載4.2.0版本的吧,其他的版本我都沒編譯通過
下載地址: wget https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2

下載NDK(最好是R17以下)

首先我們需要配置NDK的環境變量:

sudo vi ~/.bash_profile

環境變量最後添加
Mac下配置環境變量

NDKROOT=/Users/mile/soft/android-ndk-r17c
export PATH=$NDKROOT:$PATH

Mac下重啓環境變量

source ~/.bash_profile

測試環境變量是否生效

ndk-build

ffmpeg庫下載下來解壓縮目錄是這樣的
在這裏插入圖片描述

我們通過上圖configure該命令去編譯FFmpeg,這裏面有很多參數configure也是一個shell腳本
可以通過如下命令來查看參數

./configure --help

參數詳情請查看我們這裏就不多說了:https://www.jianshu.com/p/76db41141e53

二、FFmpeg 編寫build for Android shell腳本

由於configure命令參數太多,我們這裏需要編寫一個shell腳本來編譯FFmpeg動態庫,即.so庫,則需要對configure腳本進行修改。

打開configure腳本
找到如下一段:

 //修改前
SLIBNAME_WITH_MAJOR='$(SLIBNA ME).$(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)'

然後我們編寫一個shell腳本build.sh與configure同目錄下來執行configure腳本命令
build.sh代碼如下:

#!/bin/bash
NDK_ROOT=/root/ndk/android-ndk-r17c
#TOOLCHAIN 變量指向ndk中的交叉編譯gcc所在的目錄Mac下編譯目錄darwin-x86_64linux下就不是這個了
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"

#執行configure腳本,用於生成makefile
#--prefix : 安裝目錄
#--enable-small : 優化大小
#--disable-programs : 不編譯ffmpeg程序(命令行工具),我們是需要獲得靜態(動態)庫。
#--disable-avdevice : 關閉avdevice模塊,此模塊在android中無用
#--disable-encoders : 關閉所有編碼器 (播放不需要編碼)
#--disable-muxers :  關閉所有複用器(封裝器),不需要生成mp4這樣的文件,所以關閉
#--disable-filters :關閉視頻濾鏡
#--enable-cross-compile : 開啓交叉編譯(ffmpeg比較**跨平臺**,並不是所有庫都有這麼happy的選項 )
#--cross-prefix: 看右邊的值應該就知道是幹嘛的,gcc的前綴 xxx/xxx/xxx-gcc 則給xxx/xxx/xxx-
#disable-shared enable-static 不寫也可以,默認就是這樣的。
#--sysroot: 
#--extra-cflags: 會傳給gcc的參數
#--arch --target-os :
PREFIX=./android/armeabi-v7a2
./configure \
--prefix=$PREFIX \
--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 

make clean
make install

然後執行即可:

./build.sh

下面我們就等編譯並生產一個Android的文件夾即可。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章