1. 程式人生 > >android開發-Windows環境下編譯FFMPEG原始碼

android開發-Windows環境下編譯FFMPEG原始碼

1.簡介

之前有兩篇文章講到如何在windowsPC端使用FFMPEG命令列程式。

但是我想要在android開發時使用FFMPEG的功能又該怎麼辦?所以就需要編譯FFMPEG,然後才能使用。這才有了這篇文章。

1.先講思路,2.後講具體流程!

但是首先有個問題就是我的電腦是windows系統,如何編譯FFMPEG? 看網上的許多例子都是Linux和MAC系統。實在是看的我兩眼發萌。

幸好有解決辦法,那就是在Windows電腦上裝一個MinGW。因為WIndows沒有編譯環境,只有裝了這個(類似或CygWin)才有編譯環境,我們才能進行編譯。

MinGW是什麼?

  • MinGW 是一組包含檔案和埠庫,其功能是允許控制檯模式的程式使用微軟的標準C執行時(C Runtime)庫。
  • 允許你在Windows平臺生成本地的Windows程式而不需要第三方C執行時(C Runtime)庫。
  • MSYS是MinGW的一個子系統,是一套執行在Windows上的bash,也就是執行在Win上的Linux Terminal [1]。其實就是在Win上使用Linux的命令列進行操作,可以代替cmd來使用。對一些GNU的開源軟體,MSYS可能是必需的,因為它們通常需要./configure然後make才能執行。我們將MSYS和MinGW配合使用就可以打造出一個Win下的GNU命令列終端和編譯系統。
  • 下載安裝MinGW時,自動裡面會有MSYS。

有了編譯環境,是不是要有東西可以編譯,所以就需要下載FFMPEG原始碼。

有了原始碼,還不能直接編譯,因為編譯時要執行一個指令碼檔案,而這個指令碼檔案裡面有NDK的配置,所以我們還需要下載一個NDK。

所以我們總共需要下載的東西有:

接下來講具體流程,如何下載?如何安裝?如何配置環境變數,如何檢驗配置成功?最終到如何編譯使用?

2.NDK的配置

至於為什麼不從androidStudio直接下載NDK,怎麼說呢?我自己也測試過,總是有問題,少東西,最終導致編譯不成功,導致我之前放棄過要編譯FFMPEGE。後來迎難而上,終於編譯成功。一定要注意一些不為人知的小細節,不然,就算按著流程來也可能最終導致編譯失敗。你有福了,幸好看了我這篇文章,我將會告訴你不為人知的小細節,相信你一定可以編譯FFMPEG成功。

1.我下載ndk壓縮包到D盤的一個資料夾,並解壓縮了。

2.配置ndk環境變數path,在其中加入

;D:\NDK\android-ndk-r14b;

3.檢驗是否配置成功

在cmd命令列輸入   ndk-build    ,出現如下情況,則表示配置成功。

3.MinGW下載安裝配置

1.下載

2.得到一個.exe檔案(不管你放在哪),點開,然後選擇安裝位置,我是安裝到了D盤的MinGW資料夾

3.選擇了安裝位置之後,需要選擇需要安裝的元件,如上圖,我全部勾選,然後執行安裝。

執行安裝點選左上角的installation,然後點選apply change

4.安裝之後資料夾中的情況:

5.配置環境變數path,在其中加入兩個路徑:

;D:\MinGW\bin;

D:\MinGW\msys\1.0\bin

6.檢驗配置是否成功?出現下圖,即表示配置成功

7.在msys/1.0/ 有一個msys.bat 的檔案,待會下面編譯指令碼檔案時是開啟它,而不是cmd。

3.FFMPEG原始碼下載,及修改configure檔案,及建立build_android.sh指令碼檔案

1.我下載了ffmpeg原始碼壓縮包,並解壓到了一個資料夾。

2.進入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)'

3.新建一個 build_android.sh 指令碼檔案 , 用於配置及編譯使用 (名字不唯一)

4. build_android.sh 指令碼檔案裡面的內容如下:你也可以百度有其它的內容,這個不唯一

#!/bin/bash
#自己修改對應的路徑,要配置到環境變數中去
NDK=D:/NDK/android-ndk-r14b
#android4.9 對應的SDK在20左右,所以你的platforms應該選擇小於20的,因為向前相容,大於20的會有問題
SYSROOT=$NDK/platforms/android-18/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
	--enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

read -p "Press any key to continue."

5.開啟 msys.bat 而不是cmd.

進入到ffmpeg原始碼資料夾

然後輸入

$chmod 777 build_android.sh

等待一段時間,然後輸入

$make

等待兩段時間,然後輸入

$make install

6.編譯完成,會在ffmpeg原始碼資料夾中生成一個android檔案

其/android/arm/lib目錄下的so庫檔案就是能夠在Android上執行的so庫。

至此,編譯結束,得到了so庫,大功告成!

如果總是編譯失敗,不妨推倒重來,多吸取失敗經驗,一定會成功的!