Windows XP、Cygwin、NDKr5b编译Android下的ffmpeg(转)

一、准备工作

2、下载Cygwin, 请猛击这里

3、下载Android SDK,请猛击这里,Android SDK的网页

4、下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页

5、下载ffmpeg,可以下载压缩包,也可以Git一个snapshot

好了,有必要说明一下Android SDK和Android NDK SDK的区别:

  • Android SDK用于开发Android程序,开发语言为Java,主要用于界面,只能调用系统提供的功能;
  • 如果要追求高效率和实现底层一点的功能,就必须得用NDK了,NDK实际上在桌面系统上提供了交叉编译器,使你能够在桌面系统上编译和调试Anroid程序,开发语言是C和C++,google官方文档里说了,可以只使用C/C++开发应用程序,可以不使用Java,原文如下:

    Starting from API level 9, it is possible to entirely write an Android
    application with native code (i.e. without any Java). That does not mean
    that your code does not run inside a VM though, and most of the features
    of the platform will still need to be accessed through JNI.

    For more information about this topic, please read the dedicated
    document named docs/NATIVE-ACTIVITY.html (TODO: WRITE DOC).

    文档:android-ndk-r5b/docs/STABLE-APIS.html

    还带了个例子,例子见\android-ndk-r5b\samples\native-activity\,有兴趣的同学可以研究一下

 

二、安装过程

1、安装Cygwin

1)下载了一个setup.exe,运行之后,如下图所示:

2)点下一步,就出现下图界面:

3)默认选择第一项不变,再次点下一步,就显示出下面的界面:

4)选择一个根路径,选择一个硬盘空间比较大的盘,会安装很多东东的,我选择g:盘,接着下一步,大家就看到下面的界面了:

5)好了,继续下一步,各位看官耐心点,马上就到重点了:

6)OK,继续,还真罗嗦啊,下一步,见下图:

7)选择一个下载站点,我选择了台湾的ftp服务器,速度还挺快的,还是下一步,如下:

 

8)重点到了,注意选择要安装的包,其他的默认就行了,关键的是Devel,要选择下面几个包:

autoconf

automake

binutils

gcc

gcc-core

gcc-g++

gdb

libstdc++

make

如果懒得找,就直接点Devel旁边的那个default,变成Install就会全部都装了,不过要下载很长时间,安装完之后有2G多的空间,如果只选上面的几项,会快很多。

好了,接着下一步,耐心等待安装完,可以去吃个泡面先。

9)设置系统的Path环境变量到G:\cygwin\bin

2、配置SDK

NDK得依赖SDK,所以必须得先配置SDK

1)将下载到的android-sdk_r10-windows.zip,解压到磁盘的跟目录下,比如:e:\android_sdk;

2)设置系统的Path环境变量到e:\android_sdk\platform-tools,如果不设置的话,运行ndk-build的时候会提示adb不在当前Path下。

3、配置NDK

1)将下载到的android-ndk-r5b-windows.zip文件解压到一个文件夹里,最好路径短点,我的放在E:\android\android-ndk-r5b下;

2)设置系统的Path环境变量到e:\android\android-ndk-r5b,输入命令行的时候简单一点。

三、测试配置环境

1)运行cmd

2)输入bash,如果提示“'bash' 不是内部或外部命令,也不是可运行的程序或批处理文件。”请检查cygwin的path路径是否设置正确,运行后控制台会变成下面的样子:

3)在bash里面输入

 $cd /cygdrive/e/android/android-ndk-r5b/samples/hello-jni

注意:Cygwin和Mingw不一样,本地磁盘前面有/cygdrive/前缀

4)在bash里面输入

 $ndk-build

如果出现如下画面,并且存在这个文件:e:\android\android-ndk-r5b\samples\hello-jni\obj\local\armeabi\libhello-jni.so,恭喜你完成了第一阶段的工作,真不容易啊

四、编译ffmpeg

大家等得有点不耐烦了吧,当当当……主角出场了,将下载到的ffmpeg压缩包解压到磁盘,比如E:\android\projects\Player\jni\ffmpeg\,我该如何编译呢,follow me!

1、Config ffmpeg

编译ffmpeg之前必须得先configure一下,configure是一个shell脚本,根据命令行参数不同来裁剪模块,生成特定的config.h文件,这是关键的一步。

1)用UE或EditPlus等文本编辑软件新建一个文件(千万别用系统的notepad,因为windows和Linux的换行方式不一样),复制以下内容,保存文件,文件名为config.sh,并在系统环境变量里面设置NDK_ROOT为e:\android\android-ndk-r5b,也可以直接写全路径/cygdrive/e/android/android-ndk-r5b

 #!/bin/bash

 

 PREBUILT=${NDK_ROOT}/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows

 PLATFORM=android-4

 ARCH=--arch=arm

 

 ./configure \

 ${ARCH} \

 --target-os=linux --enable-cross-compile --cross-prefix=${PREBUILT}/bin/arm-linux-androideabi- \

 --extra-cflags=" -fPIC -DANDROID -std=c99 " \

 --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 \

 --disable-asm \

 --enable-neon \

 --enable-armv5te \

 --sysinclude=${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/include \

 --extra-ldflags="-Wl,-rpath-link=${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib -L${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib -nostdlib ${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib/crtbegin_static.o ${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib/crtend_android.o -lc -lm -ldl "

2)运行CMD,在DOS提示符下输入

bash
进入到Cygwin环境,并输入

 $cd /cygdrive/e/android/projects/player/jni/ffmpeg

切换到工程路径

3)输入

 ./config.sh

如果提示如下错误字符串:

 $ ./config.sh

 Unknown C compiler /toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/

 arm-linux-androideabi-gcc

 /toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androidea

 bi-gcc is unable to create an executable file.

 C compiler test failed.

 

 If you think configure made a mistake, make sure you are using the latest

 version from SVN. If the latest version fails, report the problem to the

 ffmpeg-user@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.

 Include the log file "config.err" produced by configure as this will help

 solving the problem.

请检查你的NDK SDK路径是否设置正确,仔细检查一下,肯定是错的。

如果出现下面的错误提示:

 $ ./config.sh

 E:\android\android-ndk-r5b\/toolchains/arm-linux-androideabi-4.4.3/prebuilt/wind

 ows/bin/arm-linux-androideabi-gcc is unable to create an executable file.

 C compiler test failed.

 

 If you think configure made a mistake, make sure you are using the latest

 version from SVN. If the latest version fails, report the problem to the

 ffmpeg-user@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.

 Include the log file "config.err" produced by configure as this will help

 solving the problem.

表示NDK SDK路径对了,但需要设置一下TMPDIR路径,在bash里输入

 $export TMPDIR=e:/temp
注意:e:\temp目录必须得存在

4)如果没有出现上面的两个错误提示,而且等了一段时间没有显示,表示configure已经正在运行了,config完之后会显示如下图:

恭喜你!还差最后一步就成功了。

2、编辑mk文件

为了方便ndk-build编译,android定义了一套简化版的makefile规范,具体请参考NDK SDK带的文档,要顺利编译ffmpeg需要以下几个mk文件:

1)E:\android\projects\Player\jni\文件夹下,即ffmpeg文件夹的父目录下,文件名为Android.mk,内容如下:

 include $(all-subdir-makefiles)
2)在E:\android\projects\Player\ffmpeg目录中创建一个 Android.mk 文件,内容如下

 LOCAL_PATH := $(call my-dir)

 include $(CLEAR_VARS)

 LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale

 LOCAL_MODULE := ffmpeg

 #FFMPEG_OBJ_PATH := `cygpath -m "$(LOCAL_PATH)/../../obj/local/armeabi"`

 #LOCAL_LDLIBS := -L$(call host-path, $(FFMPEG_OBJ_PATH))

 #LOCAL_LDLIBS += -lavformat -lavcodec -lavutil -lswscale -lpostproc

 include $(BUILD_SHARED_LIBRARY)

 include $(call all-makefiles-under,$(LOCAL_PATH))
3)在 E:\android\projects\Player\ffmpeg目录中创建一个 av.mk 文件,内容如下

 # 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)

#if !HAVE_LRINTF
static av_always_inline av_const long int lrintf(float x)
{
return (int)(rint(x));
}
#endif 

#if !HAVE_ROUND
static av_always_inline av_const double round(double x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif 

#if !HAVE_ROUNDF
static av_always_inline av_const float roundf(float x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif 

#if !HAVE_TRUNCF
static av_always_inline av_const float truncf(float x)
{
return (x > 0) ? floor(x) : ceil(x);
}
#endif
 
  • 编辑 libavcodec、libavfilter、libavformat、libavutil、libpostproc 和 libswscale 目录中的 Makefile 文件,删除
include $(SUBDIR)../subdir.mak

include $(SUBDIR)../config.mak

4、修改config.h文件

 将e:\android\projects\player\jni\ffmpeg目录下的config.h中的内容
#define restrict restrict 
改为
#define restrict

5、编译ffmpeg

 在bash里输入
$ndk-build 
经过漫长的等待,如无意外,会在E:\android\projects\Player\libs\armeabi\目录下生成一个libffmpeg.so文件,但这个文件无法使用,因为NDK r5b不能把几个static library编译成一个so,NDK r4b却能做到,但这也不影响我们使用,我们可以使用E:\android\projects\Player\obj\local\armeabi\里面的libavcodec.a等几个静态库,实现一个player控制层,通过JNI,给Java界面层调用。

五、后续工作

 成功编译ffmpeg后,实现一个能用的播放器还有很多工作要做,首先要解决的音视频的输出,再就是音视频的同步等,视频输出可以采用surfaceflinger,音频输出可以采用audioflinger,音视频同步可以参考这个

六、mk文件下载

 为了方便大家,我把所有的mk文件打包好了,需要的请猛击这里

七、参考链接

http://www.cnblogs.com/scottwong/archive/2011/01/01/1909455.html
http://abitno.me/compile-ffmpeg-android-ndk
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值