Mac 上編譯 ffmpeg 方法
準備工作
下載最新的 ffmpeg 下載地址為:
下載 ndk 下載地址為 :
下載後文件在 Mac 中的存放路徑如下:
ChendeMacBook-Pro:compileFF chenzongwen
/Users/chenzongwen/compileFF
ChendeMacBook-Pro:compileFF chenzongwen$
編譯 ffmpeg
首先進入 ffmpeg-3.0資料夾 ,在資料夾中增加 編譯指令碼 ffmpegConfig 檔案如下圖 :
ChendeMacBook-Pro:ffmpeg-3.0 chenzongwen$ ls
COPYING.GPLv2 RELEASE_NOTES config.h ffmpeg_filter.c ffprobe.c libavutil
COPYING.GPLv3 VERSION config.log ffmpeg_filter.d ffprobe.d libpostproc
COPYING.LGPLv2.1 arch.mak config.mak ffmpeg_filter.o ffprobe.o library.mak
COPYING.LGPLv3 cmdutils.c configure ffmpeg_g ffprobe_g libswresample
CREDITS cmdutils.d doc ffmpeg_opt.c ffserver.c libswscale
Changelog cmdutils.h ffmpeg ffmpeg_opt.d ffserver_config.c presets
INSTALL.md cmdutils.o ffmpeg.c ffmpeg_opt.o ffserver_config.h tests
LICENSE.md cmdutils_common_opts.h ffmpeg.d ffmpeg_qsv.c libavcodec tools
MAINTAINERS cmdutils_opencl.c ffmpeg.h ffmpeg_vdpau.c libavdevice version.sh
Makefile common.mak ffmpeg.o ffmpeg_videotoolbox.c libavfilter
README.md compat ffmpegConfig ffplay.c libavformat
RELEASE config.fate ffmpeg_dxva2.c ffprobe libavresample
ChendeMacBook-Pro:ffmpeg-3.0 chenzongwen$
ffmpegConfig檔案內容如下:
#!/bin/bash
NDK=/Users/chenzongwen/compileFF/android-ndk-r11b
export PATH=$PATH:$NDK
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
bash ./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffserver \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--extra-libs=-lgcc \
--sysroot=$SYSROOT \
--enable-asm \
--enable-neon \
--extra-cflags="-O3 -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm -mfpu=neon"
build_one
~
~
然後在當前資料夾下執行如下命令:
1、chenzongwen
3、chenzongwen$ make install
命令執行完之後會在當前資料夾下生成一個android 資料夾 android/arm 資料夾中的內容如下幾個資料夾 : bin include lib share
include 中存放的是標頭檔案, lib 中存放的是 so 檔案 整個編譯過程結束 。
如何使用 ffmpeg
1、 在跟 anroid-ndk-r11b ffmpeg-3.0 同級的目錄下 建立 jni 資料夾
如下 :
ChendeMacBook-Pro:compileFF chenzongwen
android-ndk-r11b ffmpeg-3.0 jni
2、將之前編譯的標頭檔案(在 include 資料夾下)拷貝到 jni 資料夾下 並且在 jni 資料夾下建立prbuilt資料夾 並將之前生成的 so(在 lib 資料夾下)拷貝到 prebuilt 資料夾下, 拷貝完成後如下圖:
ChendeMacBook-Pro:jni chenzongwen$ ls
libavcodec libavdevice libavfilter libavformat libavutil libswresample libswscale prebuild
ChendeMacBook-Pro:jni chenzongwen$ ls prebuild/
libavcodec-57.so libavfilter-6.so libavutil-55.so libswscale-4.so
libavdevice-57.so libavformat-57.so libswresample-2.so libswscale.so
ChendeMacBook-Pro:jni chenzongwen$
3、呼叫 so 方法 在當前資料夾下新增兩個檔案 Android.mk 和 Application.mk 內容分別如下 Android.mk 內容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec-56-prebuilt
LOCAL_SRC_FILES := prebuilt/libavcodec-57.so
include $(PREBUILT_SHARED_LIBRARY)
#include $(CLEAR_VARS)
#LOCAL_MODULE := avdevice-56-prebuilt
#LOCAL_SRC_FILES := prebuilt/libavdevice-57.so
#include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avfilter-5-prebuilt
LOCAL_SRC_FILES := prebuilt/libavfilter-6.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat-56-prebuilt
LOCAL_SRC_FILES := prebuilt/libavformat-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil-54-prebuilt
LOCAL_SRC_FILES := prebuilt/libavutil-55.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avswresample-1-prebuilt
LOCAL_SRC_FILES := prebuilt/libswresample-2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale-3-prebuilt
LOCAL_SRC_FILES := prebuilt/libswscale-4.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
Application.mk 的內容如下 :
ChendeMacBook-Pro:jni chenzongwen$ vim Application.mk
APP_ABI := armeabi
#APP_ABI := armeabi-v7a
APP_PLATFORM := android-10
編寫呼叫檔案 在當前資料夾下建立 com.owenchan.Test.c 檔案 測試內容如下:
#include <math.h>
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/pixfmt.h>
#include <stdio.h>
#include <wchar.h>
#include <jni.h>
#include <android/bitmap.h>
#include <string.h>
/*for android logs*/
#include <android/log.h>
#ifdef __cplusplus
extern "C" {
#endif
#if DEBUG
# define D(x...) __android_log_print(ANDROID_LOG_INFO, "h264decoder", x)
#else
# define D(...) do {} while (0)
#endif
JNIEXPORT jint JNICALL Java_com_owenchan_Test_sum
(JNIEnv * env, jobject obj,jint w, jint h)
{
return w * h;
}
#ifdef __cplusplus
}
#endif
開始編譯 在 jni 目錄下執行 :
ChendeMacBook-Pro:jni chenzongwen$ ../android-ndk-r11b/ndk-build
最後將 如下目錄下的so 拷貝到工程中就可以使用了。
ChendeMacBook-Pro:armeabi chenzongwen$ pwd
/Users/chenzongwen/compileFF/libs/armeabi
ChendeMacBook-Pro:armeabi chenzongwen$ ls
libavcodec-57.so libavutil-55.so libswscale-4.so
libavfilter-6.so libowenchan_Test.so
libavformat-57.so libswresample-2.so
ChendeMacBook-Pro:armeabi chenzongwen$