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 由于不清楚操作符 “##” 代表什么含义,所以暂时还没解决该问题。

时间: 2024-08-13 17:13:36

ffmpeg 3.2.4 + libx264 windows 编译总结的相关文章

win下编译ffmpeg库,Compile and build ffmpeg library and dll on Windows x64( 正版)

转载请注明:来自EricKing,thanks 从没想到编一个library这么坑爹,再次提醒各位百度的东西只能参考,想节约时间还是要到官网上去查看docum.不废话了,开始详细过程: ——>1.搭建Win下的GCC编译环境(因为win下vs不支持ffmpeg的compile 和build,官网上也有说这一点) ——>2.下载latest ffmpeg source(后面附官网地址),想办法将编译后的文件做成dll,这是win下编程调试的核心 (这里就用到vs下的一个vc的bash文件叫vcv

Android/NDK环境下FFmpeg及AAC,MP3,X264的编译

本篇介绍在Android/Ndk环境下FFmpeg的编译及使用, FFmpeg自带了H264.AAC.MP3的解码器,但却没有(或没有好的)相应的编码器.相应的编码器需要使用第三方库.推荐使用的第三方库为x264(H264编码) .FDK_AAC(AAC编码),lame(MP3编码). 在顺序上,应该先编译好第三方库,最后再编译FFmpeg库. [本书说明:本文作者:邵发,本文选自<FFmpeg视音频编程指南>.有关本书的详细信息请访问官网:http://www.afanihao.cn ] [

windows编译 obs-studio

github下载源码 https://github.com/jp9000/obs-studio 还需要一个开发包 http://code.fosshub.com/OBS/download/dependencies.zip 环境:windows 7 64位系统 工具:cmake 2.8.12,vs2013最新版,qt5.3.2(msvc2013_opengl版本) 编译说明:https://github.com/jp9000/obs-studio/wiki/Install-Instructions

windows编译ffmpeg2.2.4并外挂h265

0.前言 据说新出来了h265的视频,在迅雷看看上面看到的,网上查看了一下简介,貌似h265的视频比h264的视频压缩率要高,而且能做4K的视频. 同时看到网上有人试过ffmpeg在编译的时候加上了h265,这样ffmpeg看起来倒是能外挂h265的编解码,所以这篇blog文,主要是用ffmpeg来尝试一下h265. 这里引用几张x265的介绍图片(当然我自己的显示器也是4k的): 1.首先下载ffmpeg源代码 目前最新版是2.2.4 下载传送门:http://www.ffmpeg.org/r

CEF3.2623使用记录:windows编译

CEF3.2623使用记录:windows编译 1:cef3.2623下载地址 2623是cef3最后一个支持xp系统的版本,且可以支持html的audio标签,可以用作对html音频的处理下载地址为 https://bitbucket.org/chromiumembedded/cef/branch/2623.下载win32版本的cef3.2623压缩包内容如下图所示: 2:cmake编译器 编译cef3需要用到cmake编译器,从官方下载,地址为https://cmake.org/downlo

【转载】OGRE 2.1 Windows 编译

OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE: OGRE官方推出了最新的OGRE2.1版本,链接地址: https://bitbucket.org/sinbad/ogre/downloads 新版本的OGRE做出了大量的修改,从官方给出的文档我们可以看出作者们对OGRE进行了优化与完善.从上面链接中下载的官方版本并没有包含编译需要的依赖项(一向都这样),所以我们需要下

windows 编译Lua

http://www.linuxidc.com/Linux/2014-02/96459.htm sublime 配置lua build sysytem -> new build system. the content: { "cmd": ["D:\\TDDOWNLOAD\\lua-5.2.3\\lua-5.2.3\\bin\\lua.exe","$file"], "file_regex": "^(...*?):

Qpid第一课 Windows编译C++/ Qpid Client

一 浏览编译文档 INSTALL-WINDOWS.txt文档描述了Windows编译Qpid的操作步骤以及注意事项,当前采用的是Microsoft Visual Studio 2015(VC14)编译Qpid,文档指定的编译器是Microsoft Visual Studio 2012(VC11) 二编译依赖库 Qpid源码编译需要的原料: * boost      <http://www.boost.org>                   (1.58) * CMake      <

专题:Windows编译x264、SDL、faac、ffmpeg过程

Windows上编译ffmpeg完整过程,包括编译x264.SDL.faac.在Windows上编译ffmpeg需要用MinGW+msys,本专题用于记录编译过程中遇到的各种问题及解决方法,转载请注明出处: 一.下载准备 准备编译过程所需的工具和源码. (1). MinGW http://sourceforge.net/projects/mingw/files/  MSYS http://downloads.sourceforge.net/mingw/MSYS-1.0.11.exe (2). Y