Android NDK開發之旅27 NDK Linux下FFmpeg編譯

###前言linux

咱們進行Android FFmpeg開發的時候,須要一些FFmpeg預編譯的庫,這些預編譯的so庫須要在Linux環境下編譯。android

###Linux下FFmpeg編譯shell

因爲筆者公司的電腦是Ubuntu14.04系統,所以咱們直接使用Ubuntu系統進行編譯。讀者也能夠本身搭建Linux虛擬機或者購買雲服務器。vim

####關於雲服務器的購買bash

  1. 買阿里雲主機 最好是Ubuntu系統的。其中阿里雲的華北一核1GB最便宜。
  2. 咱們須要安裝XShell客戶端(內含XFTP)來對服務器進行操做、文件傳輸。經過公網地址進行鏈接便可。
  3. 爲了方便操做,直接使用root用戶便可,可是通常咱們都是須要建立用戶的。

####1、準備NDK服務器

編譯FFmpeg的時候須要用到NDK。微信

在Linux環境中,咱們須要有一個NDK的壓縮包,例如:架構

android-ndk-r10e-linux-x86_64.bin
複製代碼

而後執行下面的命令進行解壓縮便可(注意權限問題):ide

./android-ndk-r10e-linux-x86_64.bin
複製代碼

####2、配置NDK環境變量ui

環境變量配置

vim ~/.bashrc(~表明當前用戶)
複製代碼

編輯:

export NDKROOT=你的NDK根目錄
export PATH=$NDKROOT:$PATH
複製代碼

更新(否則的話就須要重啓命令行)

source ~/.bashrc
複製代碼

####3、準備FFmpeg

咱們須要去FFmpeg官網下載FFmpeg的Linux源碼,版本不須要太新:

ffmpeg-2.6.9.zip
複製代碼

而後執行解壓縮命令:

uzip ffmpeg-2.6.9.zip
複製代碼

####4、編寫shell腳本

咱們須要編寫shell腳本傳參調用ffmpeg-2.6.9下的configure腳本,進行編譯,咱們寫的shell腳本以下,build_android.sh:

#!/bin/bash
make clean
export NDK=/home/wuhuannan/Android/Sdk/ndk-bundle
export SYSROOT=$NDK/platforms/android-14/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的一些路徑,配置CPU架構類型,PREFIX是指定動態庫輸出的路徑,而後disable一些不須要的庫(可減少輸出的動態庫的大小)等等。enable-shared是生成共享庫的意思。

注意:

  1. 換行的時候須要有\,主要不要有額外的空格。
  2. 統一轉爲UTF-8無BOM格式。能夠經過note pad++進行轉碼,這樣子Windows和LInux都通用了。也能夠經過dos2unix命令進行轉碼。或者先由Linux建立文件再由Windows編輯。
  3. NDK儘可能不要使用太新的版本,通常使用Android-9便可。新版本會有一些坑,好比LOG2的問題。

####5、修改configure文件

ffmpeg-2.6.9根目錄下有個configure文件,這個文件比較重要。咱們本身寫的腳本文件就是依據這個文件來寫的。

經過這個文件咱們能夠看到FFmpeg庫之間的依賴關係,例如:

avcodec_example_deps="avcodec avutil"
複製代碼

一些編譯指令。

這裏咱們須要修改一下輸出的動態庫的命名規則:

#註釋的部分
#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)'
複製代碼

####6、執行腳本文件

咱們須要把咱們本身寫的build_android.sh放到ffmpeg-2.6.9根目錄下,而後授予權限,執行:

./build_android.sh開始編譯
複製代碼

編譯過程當中會臨時先自動生成c.mak文件,頭文件等。編譯大概幾分鐘時間。

####7、最終編譯輸出的動態庫文件以下:

輸出的動態庫文件

這些庫咱們就能夠直接放到Android Studio工程中使用了。

若是以爲個人文字對你有所幫助的話,歡迎關注個人公衆號:

公衆號:Android開發進階

個人羣歡迎你們進來探討各類技術與非技術的話題,有興趣的朋友們加我私人微信huannan88,我拉你進羣交(♂)流(♀)

相關文章
相關標籤/搜索