1. 程式人生 > >Mac 上編譯 ffmpeg 方法

Mac 上編譯 ffmpeg 方法

準備工作

下載最新的 ffmpeg 下載地址為:

下載 ndk 下載地址為 :

下載後文件在 Mac 中的存放路徑如下:

ChendeMacBook-Pro:compileFF chenzongwenlsandroidndkr11bffmpeg3.0ChendeMacBookPro:compileFFchenzongwen pwd
/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./ffmpegConfig2chenzongwen make -j4 //4 為 用4個cup進行編譯
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 chenzongwenmkdirjniChendeMacBookPro:compileFFchenzongwen ls
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$