当前位置:首页 » 编程软件 » ffmpegndk编译

ffmpegndk编译

发布时间: 2023-09-02 19:20:32

❶ FFmpeg 编译参数简单整理

以下参数使用--enable-foo启用或使用--disable-foo禁用时使用--e/d-代替。

其他的可更改优化方案:AltiVec、3DNow! 、MMX、MMX2、SSE、SSE3、armv5te、armv6、armv6t2、ARM VFP、iwmmxt、MMI、neon、VIS

使用--enable-foo启用或使用--disable-foo禁用需要的功能插件,使用--e/d-代替。某些部件(如decoder)enable时需要明确指明,例:--enable-decoder=libdavs2。

注:打开与启用非等同

其他默认开启但可以关闭的部分:ffmpeg、ffprobe、ffplay、ffserver、avdevice、avcodec、avcore、avformat、swscale、特定部件(如某个编解码器等)

可选择禁用的编码:AAN DCT、DCT、Golomb、FFT、Golomb、LPC、MDCT、RDFT、VAAPI、VDPAU、DXVA2

❷ ffmpeg configure 脚本是什么生成的

NDK全称:Native Development Kit。

1、NDK是一系列工具的集合。
* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。[1]
* NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求
”等),就可以创建出so。
* NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
2、NDK提供了一份稳定、功能有限的API头文件声明。
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc
)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
3. 利用ndk编译ffmpeg
ndk自带的文档,其中有一篇STANDALONE-TOOLCHAIN.html,里面涉及了独立编译的方法,

A typical use case if invoking the 'configure' script of an open-source library that expects a cross-compiler in the CC environment variable.
那意思很明显我们可以用这种独立编译方法,编译一些由‘configure’脚本生成的开源库,这篇介绍了把ndk当成普通编译工具使用,比我我们在linux使用的gcc命令,其实ndk都为我们提供了,甚至ndk还为我们提供了make工具。

此外你还需要了解configure参数,你可以用./configrue --help ->help.txt 生成帮助文件。我的编译代码如下:
./configure \
--logfile=FILE \
--prefix='/home/wangping/source/ffmpeg_ndk/release' \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-small \
--cross-prefix='/home/wangping/arm_android14_toolchain/bin/arm-linux-androideabi-' \
--enable-cross-compile \
--target-os=linux \
--extra-cflags='-I/home/wangping/arm_android14_toolchain/sysroot/usr/include' \
--extra-ldflags='-L/home/wangping/arm_android14_toolchain/sysroot/usr/lib' \
--arch=arm \
--disable-symver \
--disable-debug \
--disable-stripping \
--extra-cflags="-fPIC -DANDROID" \

logfile: 是输出日志一的文件名

prifix :在运行make install后,他会相应生成的库文件,及头文件拷贝的指定文件夹
cross-prefix:是你编译工具的前缀

extra-cflags:都是编译时候的选项,你在里面要提供头文件的位子
extra-ldflags:是连接时候的选项,要提供你库文件的件子
这些配置,你要参考 STANDALONE-TOOLCHAIN.htm ,你还可以自成由发挥,只要正确地指定 gcc,等编译工具和头文件以及链接库的位子即可, 比如你可以把extra-cflags和extra-ldflags去掉,而加sysroot先项,configure完成后,就运行make了。

❸ 如何用Android NDK编译FFmpeg

一、安装cygwin、配置ndk和下载ffmpeg源码

这步就不说了,网上很多教程,再次声明本教程只针对ndk R4这个版本。需要说明的是,本人在cygwin安装路径下的.bash_profile文件中指定的NDK路径如下所示。因为本人装了好几个NDK,因此后面的R4只是个标示。

NDK_R4=/cygdrive/d/android-ndk-r4
export NDK_R4

二、编译前准备和编译

1、因为R4这个NDK比较旧,交叉编译的时候需要在一个Android环境中,那简单,创建一个Android空项目,把整个项目拷出来,在项目下建立一个文件夹jni,把ffmpeg0.6.6的源码拷进去。左图,HelloJni就是我新建的一个项目,Android.mk这时候你还没有,先不用管。右图ffmpeg-0.6.6文件夹的内容要跟我一样,直接就是代码。我这里的ffmpeg_cywin这个文件夹是随便建的,放哪里无所谓的。

2、在ffmpeg-0.6.6下建立一个文件config.sh,内容如下所示。需要注意的是,unix下的换行符和windows下是不一样,如果直接拷贝到windows下的记事本,后面执行这个config.sh的时候会出问题,这里我用的是notepad++编辑的,在编辑->档案格式转换->转换为UNIX格式。(注意,后面的所有的Android.mk的编辑都有此要求)。

简单说一下这个config.sh,PREBUILT和PLATFORM根据你安装ndk的位置而不同,config.sh其实是一个脚本,执行这个脚本的时候又调用了另外一个脚本configure,configure主要是根据编译选项(下面enable disable那些),生成相应的编译配置,就是说你想要编译ffmpeg什么模块就自己定制编译选项的内容。基本上这个文件只要修改一下PREBUILT和PLATFORM就行,其他都不用改。

#!/bin/bash
export PREBUILT=D://android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0
export PLATFORM=D://android-ndk-r4/build/platforms/android-8/arch-arm
./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-encoders \
--disable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--disable-network \
--disable-mpegaudio-hp \
--disable-avdevice \
--enable-cross-compile \
--cc=$PREBUILT/bin/arm-eabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-eabi- \
--nm=$PREBUILT/bin/arm-eabi-nm \
--extra-cflags="-fPIC -DANDROID" \
--disable-asm \
--enable-neon \
--enable-armv5te \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
3、修改configure文件,找到下图的内容,修改成我这样,这个是用来存放执行脚本过程的临时文件的,我这里用的是D://NDK,你可以设置其他地方,但是要先创建好这个文件夹,放哪里无所谓的。

4、然后在cywin中进入ffmpeg0.6.6文件夹,执行chmod -x config.sh,然后执行./config,此过程需要一定的时间。如果这一步出现问题,很有可能是你config.sh中的PREBUILT和PLATFORM的路径设置不对,或者是你拷贝内容到config.sh的时候没有在UNIX格式下。执行完如下图所示。

5、在ffmpeg-0.6.6下会生成一个config.h文件,编辑它,找到#define restrict restrict这一行,把它改成#define restrict

6、在libavutil/libm.h下,把所有static的方法注释掉或者直接删掉。

7、修改libavcodec,libavfilter,libavformat,libavutil,libpostproc和libswscale目录的MakeFile文件,每个文件中,删除语句

include $( SUBDIR ) ../config.mak 和 include $ (SUBDIR) .. / subdir.mak。

libavcodec下的makefile中搜索inverse.o,把它所在的那一行删掉,要不编译的时候会冲突。

8、在ffmpeg-0.6.6文件夹下,创建av.mk文件(UNIX格式),内容如下:

#LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale

#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak

OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile

# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)

FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"

ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))

ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif

C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))

FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))

9、在jni文件夹下,创建Android.mk(UNIX格式),内容如下:
include $(all-subdir-makefiles)

10、在ffmpeg-0.6.6文件夹下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))

11、在ffmpeg-0.6.6\libavformat下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

12、在ffmpeg-0.6.6\libavcodec下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

13、在ffmpeg-0.6.6\libavfilter、libavutil、libpostproc和libswscale下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
14、然后在jni目录下,运行$NDK_R4/ndk-build -B,这里的命令需要根据你自己的情况修改,然后就开始编译了。过程需要10来分钟,成功之后,会在libs下生产libffmpeg.so。如果编译出来的libffmpeg.so只有1.5k,得如下修改一下NDK,再重新编译。

把下面红色部分加到NDK的build/core/build-binary.mk里:
LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES))
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES))
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
$(call mole-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES))
$(call mole-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries)
...
$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries)
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries)
接着再将最外层ffmpeg/Android.mk里面的LOCAL_STATIC_LIBRARIES改成LOCAL_STATIC_WHOLE_LIBRARIES

❹ 如何用Android NDK编译FFmpeg

android的NDK开发需要在linux下进行:

  1. 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。

  2. 安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库

  3. android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。

NDK编译步骤:

a.选择ndk自带的例子hello-jni,我的位于E:android-ndk-r5sampleshello-jni(根据具体的安装位置而定) 。

b.运行cygwin,输入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,进入到E:android-ndk-r5sampleshello-jni目录。

c.输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)

d.此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,ndk就运行正常啦。

❺ ffmpeg 64位编译脚本

NDK版本:android-ndk-r14b

ffmpeg版本:4.2.4 / 4.4

Ubuntu版本:15.5

#!/bin/bash

  NDK=/home/linrendi/Desktop/Compile/android-ndk-r14b

  PLATFORM=$NDK/platforms/android-21/arch-arm64

  TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64

  PREFIX=/home/linrendi/Desktop/ffmpeg64

  CPU=armv8-a

  function build_one

  {

      ./configure \

  --prefix=$PREFIX \

  --target-os=android \

  --disable-doc \

  --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \

  --arch=arm64 \

  --cpu=$CPU \

  --disable-asm \

  --sysroot=$PLATFORM \

  --extra-cflags="-I$PLATFORM/usr/include" \

  --cc=$TOOLCHAIN/bin/aarch64-linux-android-gcc \

  --nm=$TOOLCHAIN/bin/aarch64-linux-android-nm \

  --disable-shared --enable-static \

  --enable-small --disable-debug \

  --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-symver \

  --enable-neon  --enable-pthreads \

  --disable-devices --disable-encoders \

  --enable-hwaccels --enable-jni --enable-mediacodec \

  --enable-encoder=aac \

  --enable-decoder=h264_mediacodec \

  --enable-hwaccel=h264_mediacodec \

  --enable-encoder=mjpeg \

  --enable-encoder=ljpeg --enable-encoder=jpeg2000 --enable-encoder=jpegls \

  --enable-muxer=mp4 --enable-muxer=mjpeg \

  --enable-runtime-cpudetect \

    make clean

    make -j4

    make install

    $TOOLCHAIN/bin/aarch64-linux-android-ld \

    -rpath-link=$PLATFORM/usr/lib \

    -L$PLATFORM/usr/lib \

    -L$PREFIX/lib \

    -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \

    $PREFIX/libffmpeg.so \

    libavcodec/libavcodec.a \

    libavfilter/libavfilter.a \

    libswresample/libswresample.a \

    libavformat/libavformat.a \

    libavutil/libavutil.a \

    libswscale/libswscale.a \

    libavdevice/libavdevice.a \

    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \

    $TOOLCHAIN/lib/gcc/aarch64-linux-android/4.9.x/libgcc.a

  }

  build_one

❻ 如何使用ndk编译ffmpeg静态库

如何使用ndk为ffmpeg编译rtmp+polarssl静态库?这个问题花了我整整一天时间。其中遇到很多小问题,这里记录一下,方便自己也方便其他人。

1、编译polarssl,查看其Readme文件即可,不需要configure,只需要make时带上必要的参数即可,不过要记得在每一次执行make命令时都带上CC的参数(指向你的arm gcc),因为我试过在make install时没有带上CC的参数,虽然能编译出polarssl但是未能正确被rtmp引用到。

2、因为前面我用的polarssl是当前最新(1.3.7)版本,而librtmp使用的好像是polarssl1.0.0以下版本的api,所以需要修改rtmp部分源码,让其调用新版polarssl的api,这里的修改可以参照《Migrating from PolarSSL-1.2 to the PolarSSL 1.3 branch》和《[rtmpmp] branch master updated. a312ac7 Fix compat with PolarSSL >= 1.1.0》。

3、出现 undefined reference to `havege_random’错误,这里是因为polarssl默认关闭了havege模块,需要你手动开启,主要就是修改include/polarssl/config.h,去掉POLARSSL_HAVEGE_C前的注释,也就是要定义POLARSSL_HAVEGE_C,如下:
#define POLARSSL_HAVEGE_C

4、在编译出上面两个库之后,可以开始编译ffmpeg(2.1.1版本)了,如果遇到下面的问题 check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
ERROR: librtmp not found
这里有三种解决方法:
第一种,因为是网络上传播最多的,算是比较简便的方法,就是修改ffmpeg的configure,将以下一行:
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
改为:
enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lz
或者直接注释掉&& *** 部分,然后再自己加上librtmp的库路径也行

第二种,(比较推荐,因为解决了这个会顺带解决大部分找不到库的错误!)因为这里使用了pkg-config工具查找库,而这个工具ndk并没有附带提供,而出现check_pkg_config相关错误的话,只要稍加注意,会发现在使用configure配置ffmpeg的交叉编译时,已经有相应的pkg-config不存在的警告了。我对这个工具不熟悉,所以我只是简单地加上了一个软链接到系统的pkg-config,如下:
ln -s /usr/bin/pkg-config /home/cidy0106/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config
这个时候重新configure的话可能会出现找不到polarssl库的错误提示,需要修改一下librtmp安装目录里的librtmp.pc,把以下内容:
Libs: -L${libdir} -lrtmp -lz
改为:
Libs: -L${libdir} -lrtmp -lz -lpolarssl

至此,就可以正确编译出ffmpeg了
转载

热点内容
企图SQL 发布:2024-11-20 07:24:29 浏览:136
冰火ftp 发布:2024-11-20 07:14:35 浏览:89
android实时视频播放 发布:2024-11-20 07:11:18 浏览:103
oracle存储过程数组定义 发布:2024-11-20 07:11:17 浏览:844
64的汇编编译器 发布:2024-11-20 07:05:43 浏览:856
保定市后推式存储货架哪里买 发布:2024-11-20 07:03:25 浏览:556
家用suv适合什么配置 发布:2024-11-20 07:01:45 浏览:818
java免费课程 发布:2024-11-20 06:54:14 浏览:264
手机可以直接升级方舟编译器吗 发布:2024-11-20 06:53:35 浏览:285
成都plc编程培训 发布:2024-11-20 06:47:45 浏览:412