ffmpeg 3.2.4 + libx264 windows 编译总结

___________________________编译环境__________________________________

NDK 环境:android-ndk-r13b

MinGW环境:Basic Setup下Mark了所有的项目,FFmpeg需要使用msys环境进行编译

ffmpeg :3.2.4 下载地址

libx264:官网最新

_____________________________________________________________________

___________________________编译配置___________________________________

在解压的ffmpeg目录下新建一个sh文件,并填入如下内容

关键变量设置是NDK路径

#!/bin/bash 
NDK=E:/android-ndk-r13b
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function 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-r13b
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
EXTRA_LIB=E:/FFmpeg/android-lib
function 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 libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := avcodec
LOCAL_SRC_FILES := libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := avfilter
LOCAL_SRC_FILES := libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := avformat
LOCAL_SRC_FILES := libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := avutil
LOCAL_SRC_FILES := libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := postproc
LOCAL_SRC_FILES := libpostproc.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := swresample
LOCAL_SRC_FILES := libswresample.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := swscale
LOCAL_SRC_FILES := libswscale.a
include $(PREBUILT_STATIC_LIBRARY)

# prepare libX
include $(CLEAR_VARS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE    := x264
LOCAL_SRC_FILES := libx264.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_MODULE    := NativeAppTest
LOCAL_SRC_FILES := NativeAppTest.cpp

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_CFLAGS     := -D__STDC_CONSTANT_MACROS -Wno-sign-compare -Wno-switch -Wno-pointer-sign -DHAVE_NEON=1 -mfpu=neon -mfloat-abi=softfp -fPIC -DANDROID

LOCAL_STATIC_LIBRARIES := avfilter avformat avcodec postproc swresample swscale avutil x264
LOCAL_LDLIBS     := -L$(NDK_ROOT)/platforms/$(APP_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -llog -ljnigraphics -lz -ldl


include $(BUILD_SHARED_LIBRARY)

 

Application.mk

APP_STL := gnustl_static
APP_LDFLAGS := -latomic
APP_ABI := armeabi-v7a
APP_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 JNICALL
Java_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 由于不清楚操作符 “##” 代表什么含义,所以暂时还没解决该问题。

 

转载于:https://www.cnblogs.com/ltz1990/p/7536018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值