Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 移植 ffmpeg (一)

android 移植 ffmpeg (一)

編輯:關於Android編程

最近兩天為了測試使用ffmpeg獲取視頻圖片的效率問題,玩了一把ffmpeg的移植工作. 在這裡作下記錄。

所有測試都只在mac系統中測試。

 

1. 下載ffmpeg

在方官網頁中http://ffmpeg.org/download.html 中有ffmpeg的git地址:

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

 

shell中運行到要存放的目錄運行上命令

 

172-15-70-196:ffmpeg jerome$ pwd
/Users/jerome/dev/ffmpeg
172-15-70-196:ffmpeg jerome$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

 

就會在當前目錄中生成ffmpeg子目錄,目錄中包含ffmpeg的源代碼。

我目前的源碼目錄為 :/Users/jerome/dev/ffmpeg/ffmpeg

 

2. 編譯ffmpeg

2.1 修改 configure文件

下面是我注釋掉的和修改的內容

3220 #SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
3221 #LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
3222 #SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
3223 #SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
3224 SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3225 LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
3226 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3227 SLIB_INSTALL_LINKS='$(SLIBNAME)'

2.2 編譯 編譯shell命令文件build_andriod_mac.sh

在/Users/jerome/dev/ffmpeg/ffmpeg中建立build_andriod_mac.sh文件

文件內容為

#!/usr/bin/env bash

export NDK=/Users/jerome/dev/android-ndk-r12b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export PLATFORM=$NDK/platforms/android-23/arch-arm
export PREFIX=$NDK/sources/ffmpeg/android
build_one(){
./configure --target-os=linux \
        --prefix=$PREFIX --enable-cross-compile \
        --enable-runtime-cpudetect --disable-asm \
        --arch=arm --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
        --cross-prefix=$PREBUILT/bin/arm-linux-androideabi \
        --disable-stripping --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
        --sysroot=$PLATFORM --enable-gpl --enable-shared --disable-static \
        --enable-small --disable-ffprobe --disable-ffplay --disable-ffmpeg \
        --disable-ffserver --disable-debug \
        --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"
}

build_one

make clean
make
make install

 

接著修改文件權限為可執行

chmod 777build_andriod_mac.sh

 

幾點要修改的說明說明:


NDK路徑:NDK路徑要跟自己設置的版本一致。我的版本是

	export NDK=/Users/jerome/dev/android-ndk-r12b

 

PRODUILT變量: 這個要一致,我就在這問題是查了好久才解決的,就是確保你的路徑存在!


export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

 


 

 


PLATFORM變量: 設置ok ! export PLATFORM=$NDK/platforms/android-23/arch-arm

 


生成存放路徑PREFIX: 為了最後使用ndk-build生成工具方便,我存放到了ndk環境路徑下面.

 

還要注意其它設置了路徑的目錄是否存在(這主要跟ndk版本有關)。

 

3. 安裝ndk(如果沒有安裝可要進行更新)

官方地址https://developer.android.com/ndk/downloads/index.html

目前官方地址不好下載,我找了個服務器進行下載http://mirrors.neusoft.edu.cn/android/repository/?C=M&O=D

按時間倒序排序 找到最新的版本:

\

我是mac系統所以下載了android-ndk-r12b-darwin-x86_64.zip 版本。進行解壓到目錄/Users/jerome/dev/, 在這目錄下生成了ndk目錄android-ndk-r12b, 所以ndk路徑就為

/Users/jerome/dev/android-ndk-r12b

 

就可以正常使用了。

 

4. 編譯ffmpeg

 

172-15-70-196:ffmpeg jerome$ pwd
/Users/jerome/dev/ffmpeg/ffmpeg
172-15-70-196:ffmpeg jerome$ chmod 777 build_andriod_mac.sh 
172-15-70-196:ffmpeg jerome$ ./build_andriod_mac.sh 

運行完之後會生成include, lib文件:

 

 

172-15-70-196:android jerome$ pwd
/Users/jerome/dev/android-ndk-r12b/sources/ffmpeg/android
172-15-70-196:android jerome$ ls
include	lib
172-15-70-196:android jerome$ 

列出生成的文件:

 

 

libavdevice-57.so	libavfilter.so		libavutil-55.so		libpostproc.so		libswscale-4.so
172-15-70-196:android jerome$ ls -l lib
total 19640
-rwxr-xr-x   1 jerome  staff  6336784  9  2 17:51 libavcodec-57.so
lrwxr-xr-x   1 jerome  staff       16  9  2 17:51 libavcodec.so -> libavcodec-57.so
-rwxr-xr-x   1 jerome  staff    98208  9  2 17:51 libavdevice-57.so
lrwxr-xr-x   1 jerome  staff       17  9  2 17:51 libavdevice.so -> libavdevice-57.so
-rwxr-xr-x   1 jerome  staff  1358684  9  2 17:51 libavfilter-6.so
lrwxr-xr-x   1 jerome  staff       16  9  2 17:51 libavfilter.so -> libavfilter-6.so
-rwxr-xr-x   1 jerome  staff  1450792  9  2 17:51 libavformat-57.so
lrwxr-xr-x   1 jerome  staff       17  9  2 17:51 libavformat.so -> libavformat-57.so
-rwxr-xr-x   1 jerome  staff   304764  9  2 17:51 libavutil-55.so
lrwxr-xr-x   1 jerome  staff       15  9  2 17:51 libavutil.so -> libavutil-55.so
-rwxr-xr-x   1 jerome  staff    24240  9  2 17:51 libpostproc-54.so
lrwxr-xr-x   1 jerome  staff       17  9  2 17:51 libpostproc.so -> libpostproc-54.so
-rwxr-xr-x   1 jerome  staff   112832  9  2 17:51 libswresample-2.so
lrwxr-xr-x   1 jerome  staff       18  9  2 17:51 libswresample.so -> libswresample-2.so
-rwxr-xr-x   1 jerome  staff   322464  9  2 17:51 libswscale-4.so
lrwxr-xr-x   1 jerome  staff       15  9  2 17:51 libswscale.so -> libswscale-4.so
drwxr-xr-x  10 jerome  staff      340  9  2 17:51 pkgconfig
172-15-70-196:android jerome$ ls -l include
total 0
drwxr-xr-x  19 jerome  staff   646  9  2 17:51 libavcodec
drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libavdevice
drwxr-xr-x   7 jerome  staff   238  9  2 17:51 libavfilter
drwxr-xr-x   5 jerome  staff   170  9  2 17:51 libavformat
drwxr-xr-x  75 jerome  staff  2550  9  2 17:51 libavutil
drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libpostproc
drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libswresample
drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libswscale
172-15-70-196:android jerome$ 

到此,編譯就ok了。

5.添加Android.mk文件

這文件作用主要是告訴ndk怎麼把ffmpeg的.so的路徑及頭文件連接起來。

文件內容

 

LOCAL_PATH:= $(call my-dir)

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

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

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

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

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

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

Android.mk文件簡要說明:

 

LOCAL_PATH:$(callmy-dir) 把當前文件夾(即:Android.mk所在的路徑)設置成 當前路徑。 include$(CLEAR_VARS) 請除掉除LOCAL_PATH之外的變量信息,目前是為了防止引入不必要的環境變量,影響後面的模塊的處理流程 LOCAL_MODULE:=libavcodec 設置當前模塊名為 libavcodec LOCAL_SRC_FILES:=lib/libavcodec-57.so 當前模塊對應的源文件,ndk默認在 LOCAL_PATH路徑下查找,如果找不到,會報錯。 LOCAL_EXPORT_C_INCLUDES:=include 設置頭文件目錄,目的是ndk編譯時能夠找到頭文件,也是LOCAL_PATH下的include文件。也可以寫成 LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include 效果是一樣的。 include$(PREBUILT_SHARED_LIBRARY 負責收集自從上次調用 ‘include$(CLEAR_VARS)’以來,定義在LOCAL_XXX變量中的所有信息,並且決定編譯什麼,如何正確地去做。並根據其規則生成動態庫。 當前例子中,只是把 lib/libavcodec-57.so文件進行了復制。   上述文件定義了庫有:libavcodec,libavformat,libswscale,libavutil,libavfilter,libswresample. 而生成的lib中還有libpostproc,libavdevice, 在我第一個例子中沒有用到這兩個庫,所以就沒有添加進Android.mk文件中,自己偷了一下懶,為了使用方便,讀者可自行加上。

 

 

當前的路徑內容為:

 

172-15-70-196:android jerome$ pwd
/Users/jerome/dev/android-ndk-r12b/sources/ffmpeg/android
172-15-70-196:android jerome$ ls
Android.mk		include		lib
172-15-70-196:android jerome$ 

 

 

 

到此,環境配置就完成了。

 

後記

這一篇主要是環境配置。 下一篇將展示實際例子如何使用。

 

最後我的配置源文件:

配置文件及android_build_mac.sh文件下載

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved