ffmpeg 3.2.4 + libx264 windows 編譯總結

來源:互聯網
上載者:User

標籤:prepare   ffmpeg   undefined   col   too   roc   通過   forms   -fpic   

___________________________編譯環境__________________________________

NDK 環境:android-ndk-r13b

MinGW環境:Basic Setup下Mark了所有的項目,FFmpeg需要使用msys環境進行編譯

ffmpeg :3.2.4

libx264:官網最新

_____________________________________________________________________

___________________________編譯配置___________________________________

在解壓的ffmpeg目錄下建立一個sh檔案,並填入如下內容

關鍵變數設定是NDK路徑

#!/bin/bash NDK=E:/android-ndk-r13bSYSROOT=$NDK/platforms/android-19/arch-arm/TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64function build_one { ./configure      --prefix=$PREFIX      --enable-asm      --enable-neon      --enable-static      --enable-small      --disable-shared      --disable-ffmpeg      --disable-ffplay      --disable-ffprobe      --disable-ffserver      --disable-avdevice      --disable-doc      --disable-symver      --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-      --target-os=linux      --arch=arm      --cpu=armv7-a      --enable-cross-compile      --sysroot=$SYSROOT      --extra-cflags="-fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp -I$NDK/platforms/android-19/arch-arm/usr/include"      --extra-ldflags="$ADDI_LDFLAGS"           make clean      make      make install } CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm"  build_one

附帶上libx264庫加入進來後的編譯指令碼(EXTRA_LIB 指向的是 libx264編譯後組建目錄,包括標頭檔[include]和靜態庫[lib]檔案夾):

#!/bin/bash NDK=E:/android-ndk-r13bSYSROOT=$NDK/platforms/android-19/arch-arm/TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64EXTRA_LIB=E:/FFmpeg/android-libfunction build_one { ./configure      --prefix=$PREFIX      --enable-asm      --enable-neon      --enable-static      --enable-small      --enable-libx264      --enable-gpl      --enable-encoder=libx264      --disable-shared      --disable-doc      --disable-ffmpeg      --disable-ffplay      --disable-ffprobe      --disable-ffserver      --disable-avdevice      --disable-symver      --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-      --target-os=linux      --arch=arm      --cpu=armv7-a      --enable-cross-compile      --sysroot=$SYSROOT      --extra-cflags="-I$EXTRA_LIB/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp -I$NDK/platforms/android-19/arch-arm/usr/include"      --extra-ldflags="-L$EXTRA_LIB/lib -lx264 $ADDI_LDFLAGS"           make clean      make      make install } CPU=arm PREFIX=$(pwd)/android/x264_lib/$CPU ADDI_CFLAGS="-marm"  build_one

編譯好後,Eclipse建立工程,添加C++庫支援,編寫java jni介面,在bin下的classes目錄下,使用javah可以產生標頭檔。

附上主要實現代碼,以及兩個編譯mk檔案寫法:

Android.mk

LOCAL_PATH := $(call my-dir)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := avcodecLOCAL_SRC_FILES := libavcodec.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := avfilterLOCAL_SRC_FILES := libavfilter.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := avformatLOCAL_SRC_FILES := libavformat.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := avutilLOCAL_SRC_FILES := libavutil.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := postprocLOCAL_SRC_FILES := libpostproc.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := swresampleLOCAL_SRC_FILES := libswresample.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := swscaleLOCAL_SRC_FILES := libswscale.ainclude $(PREBUILT_STATIC_LIBRARY)# prepare libXinclude $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_MODULE    := x264LOCAL_SRC_FILES := libx264.ainclude $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)TARGET_ARCH_ABI := armeabi-v7aLOCAL_MODULE    := NativeAppTestLOCAL_SRC_FILES := NativeAppTest.cppLOCAL_C_INCLUDES += $(LOCAL_PATH)/includeLOCAL_CFLAGS     := -D__STDC_CONSTANT_MACROS -Wno-sign-compare -Wno-switch -Wno-pointer-sign -DHAVE_NEON=1 -mfpu=neon -mfloat-abi=softfp -fPIC -DANDROIDLOCAL_STATIC_LIBRARIES := avfilter avformat avcodec postproc swresample swscale avutil x264LOCAL_LDLIBS     := -L$(NDK_ROOT)/platforms/$(APP_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -llog -ljnigraphics -lz -ldlinclude $(BUILD_SHARED_LIBRARY)

 

Application.mk

APP_STL := gnustl_staticAPP_LDFLAGS := -latomicAPP_ABI := armeabi-v7aAPP_PLATFORM := android-19

 

NativeApp.cpp (因為FFmpeg是純C實現,所以在cpp檔案中引用頭的時候,需加上[extern "C"]包裹)否則編譯將出現如下錯誤:

jni/NativeAppTest.cpp:21: error: undefined reference to ‘avcodec_configuration()‘clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)make: *** [obj/local/armeabi-v7a/libNativeAppTest.so] Error 1
#include <jni.h>extern "C"{    #include "libavcodec/avcodec.h"}#include <com_ltz_nativeapptest_anative_DoInFastMode.h>/* * Class:     com_ltz_nativeapptest_anative_DoInFastMode * Method:    getVersion * Signature: ()I */JNIEXPORT jint JNICALL Java_com_ltz_nativeapptest_anative_DoInFastMode_getVersion  (JNIEnv *, jclass){    return 0;}JNIEXPORT jstring JNICALLJava_com_ltz_nativeapptest_anative_DoInFastMode_getCfg    (JNIEnv *env, jclass){    // TODO    char info[10000] = {0};    sprintf(info, "%s\n", avcodec_configuration());    return env->NewStringUTF(info);}

 

另外附上JNI目錄結構:

______________________________失敗部分總結________________________________________

FFmpeg使用了master分支的最新代碼,使用NDK r10c和r13b在編譯 avcodec都出現了莫名其妙的錯誤:

1處是aaccoder.c 檔案中search_for_ms函數 在初始化B0,B1報符號錯誤。懷疑變數名與宏衝突,所以改為了BC0,BC1,改檔案編譯通過。

2處:hevc_mvs.c 檔案的宏定義 

#define TAB_MVF_PU(v)                                                       TAB_MVF(((x ## v) >> s->ps.sps->log2_min_pu_size),                                 ((y ## v) >> s->ps.sps->log2_min_pu_size))

提示找不到x,y 由於不清楚操作符 “##” 代表什麼含義,所以暫時還沒解決該問題。

 

ffmpeg 3.2.4 + libx264 windows 編譯總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.