`
wang_peng1
  • 浏览: 3958663 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用 NDK r9 编译ffmpeg

 
阅读更多

1. 环境 ubuntu 我的是13.10  ndk r9 64位

2. 下载ffmpeg http://www.ffmpeg.org/download.html  找到 

FFmpeg 2.1.3 "Fourier"

2.1.3 was released on 2014-01-15. It is the latest stable FFmpeg release from the 2.1 release branch, which was cut from master on 2013-10-28. Amongst lots of other changes, it includes all changes from ffmpeg-mt, libav master of 2013-10-27, libav 9 as of 2013-10-27.

It includes the following library versions:

  libavutil      52. 48.101
  libavcodec     55. 39.101
  libavformat    55. 19.104
  libavdevice    55.  5.100
  libavfilter     3. 90.100
  libswscale      2.  5.101
  libswresample   0. 17.104
  libpostproc    52.  3.100

Download bzip2 tarball  下载

下载之后 解压到 $NDK/sources   文件夹下面,这是因为编译快捷以及方便使用

3.  找到 ffmpeg-xxx/configure 找到如下几行:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

 上面几行会导致libavcodec.so.<version> (e.g. libavcodec.so.55),不会被android承认 ,修改为;

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

 4. 复制下面的代码到文本中 并命名为 build_android.sh,注意这个文件应该保存到 ffmpeg-xxx/configure 同一个文件夹下

#!/bin/bash
NDK=$HOME/Desktop/adt/android-ndk-r9
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --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 \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_one

 注意修改 NDK=$HOME/Desktop/adt/android-ndk-r9 这行  

5. 执行 

sudo chmod +x build_android.sh

./build_android.sh

 6.输出  $NDK/sources/ffmpeg-xxx/android,  arm/lib 和arm/include 

注意 arm/lib包含了两个 library files (e.g.: libavcodec-55.so) 和 symbolic links (e.g.: libavcodec.so) 我们需要删掉 symbolic links .

7. 让ffmpeg Libraries用在我们的工程下

为了使ffmpeg libraries 可以作为 reusable modules, 需要添加一个文件 $NDK/sources/ffmpeg-xxx/android/arm/Android.mk 使用如下内容,

include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-52.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-3.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
 
include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample-0.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

 这就是为什么我们把源码放在source文件夹下,ndk会自动寻找

8.使用

 使用 libraries在Android project’s jni/Android.mk file,

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_MODULE    := tutorial03
LOCAL_SRC_FILES := tutorial03.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil
 
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.0.1/android/arm)

 这里你就会发现 我们用到了source中调用了 import-module 使用相对路径去调用。

 

 

分享到:
评论
3 楼 loovejava 2014-05-29  
6步没有生成文件夹,7步和8步的mk文件分别怎么置放??
2 楼 ailuoben 2014-05-22  
ygswine 写道
你好. 按照你的操作在编译 ./build_android.sh时一直报
--cross-prefix=/home/android/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-: No such file or directory

是什么原因?


#!/bin/bash
NDK=/home/android/android-ndk-r9d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

在ubuntu中看一下这个文件是不是每行结束自动加上了两个空格,删掉空格就好了。我的是这样解决的
1 楼 ygswine 2014-03-29  
你好. 按照你的操作在编译 ./build_android.sh时一直报
--cross-prefix=/home/android/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-: No such file or directory

是什么原因?


#!/bin/bash
NDK=/home/android/android-ndk-r9d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

相关推荐

    ndk r9编译的ffmpeg2.2.4库可在android上使用

    用ndk r9编译的ffmpeg2.2.4库,可以在android中通过jni方法调用, 头文件请自己到官网下载源代码

    在ndk9环境下编译ffmpeg

    本教程将详细介绍如何在NDK9环境下编译FFmpeg,以生成适用于Android平台的动态库和静态库。 首先,你需要准备以下环境: 1. 安装Android NDK r9,这是Android原生开发工具包,提供了在本地编写C/C++代码并运行在...

    ndk自带hello-jni工程测试ndk编译ffmpeg2.2的所有so库

    针对之前有的小伙伴说使用hello-jni测试 NDK-r9编译好的最新的FFmpeg2.2的所有so库和头文件 的时候。在使用cygwin编译jni的时候会报错:”undefined reference to 'avcodec_version'“ 的问题,所以现在把本人在...

    NDK-r9编译好的最新的FFmpeg2.2的所有so库和头文件

    在ubuntu 64位下使用android-ndk-r9d 编译最新版本ffmpeg2.2 所生成的8个so库:libavcodec.so libavdevice.so libavfilter.so libavformat.so libavutil.so libswresample.so libswscale.so libpostproc.so 以及对应...

    android用NDKr9d编译最新ffmpeg-2.2-rc1

    在本文中,我们将讨论如何使用NDK(Native Development Kit)R9d编译FFmpeg的最新稳定版本2.2-rc1。这个过程适用于Mac OS系统,同时也适用于其他版本的FFmpeg。 首先,你需要下载Android NDK。NDK是Google提供的一...

    android ffmpeg x264 aac 一键编译脚本包含readme使用方法

    使用ndk编译ffmpeg x264 faac使用该脚本可以一键编译完成,编译的生成的库比较小,方便快捷。使用android ndk-r9d编译测试通过,特别适合jni方法调用更适合qt for android 开发。

    android ffmpeg

    4. **编译FFmpeg**:配置完成后,执行`make`和`make install`,将FFmpeg库编译并安装到指定目录。 5. **创建Android.mk文件**:在项目中创建一个Android.mk文件,配置LOCAL_PATH,指定编译的源码目录,然后引入...

    ffmpeg-2.2.1-android

    使用android-ndk-r9d编译的FFmpeg2.2.1版本,支持H264解码,对做Android手机视频监控开发的朋友或许有用。

    txplayer:基于 ffmpeg 的播放器

    #编译前请设置NDK路径 #我的NDK路径如下:#export ANDROID_NDK=/home/yyl/javatool/android-ndk-r9d #export PATH=${ANDROID_NDK}:$PATH #在shell中执行以下命令 1、 cd txplayer 2、 ./init-android.sh 3、 cd ...

Global site tag (gtag.js) - Google Analytics