您的位置:首页 > 其它

Windows XP、Cygwin、N…

2014-06-14 19:38 447 查看
谢谢,非常受益!原文地址:XP、Cygwin、NDKr5b编译Android下的ffmpeg">Windows XP、Cygwin、NDKr5b编译Android下的ffmpeg作者:jack_wuwei历经挫折和摧残,终于成功在Windows XP, Cygwin, NDK SDK
r5b下成功编译了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
Androidapplication with native code (i.e. without any Java). That does not
meanthat your code does not run inside a VM though, and most of the
featuresof the platform will still need to be accessed through JNI.For more information about this topic, please read the
dedicateddocument named docs/NATIVE-ACTIVITY.html (TODO: WRITE DOC).文档:android-ndk-r5b/docs/STABLE-APIS.html还带了个例子,例子见android-ndk-r5bsamplesnative-activity,有兴趣的同学可以研究一下

二、安装过程

1、安装Cygwin

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



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

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

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

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

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

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

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

autoconfautomakebinutilsgccgcc-coregcc-g++gdblibstdc++make如果懒得找,就直接点Devel旁边的那个default,变成Install就会全部都装了,不过要下载很长时间,安装完之后有2G多的空间,如果只选上面的几项,会快很多。好了,接着下一步,耐心等待安装完,可以去吃个泡面先。

9)设置系统的Path环境变量到G:cygwinbin

2、配置SDK

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

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


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

3、配置NDK

1)将下载到的android-ndk-r5b-windows.zip文件解压到一个文件夹里,最好路径短点,我的放在E:androidandroid-ndk-r5b下;2)设置系统的Path环境变量到e:androidandroid-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:androidandroid-ndk-r5bsampleshello-jniobjlocalarmeabilibhello-jni.so,恭喜你完成了第一阶段的工作,真不容易啊

四、编译ffmpeg

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

1、Config ffmpeg

编译ffmpeg之前必须得先configure一下,configure是一个shell脚本,根据命令行参数不同来裁剪模块,生成特定的config.h文件,这是关键的一步。1)用UE或EditPlus等文本编辑软件新建一个文件(千万别用系统的notepad,因为windows和Linux的换行方式不一样),复制以下内容,保存文件,文件名为config.sh,并在系统环境变量里面设置NDK_ROOT为e:androidandroid-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:androidandroid-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:androidprojectsPlayerjni文件夹下,即ffmpeg文件夹的父目录下,文件名为Android.mk,内容如下:
include $(all-subdir-makefiles)

2)在E:androidprojectsPlayerffmpeg目录中创建一个 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:androidprojectsPlayerffmpeg目录中创建一个 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_LRINTFstatic av_always_inline av_const long int lrintf(float x){return (int)(rint(x));}#endif#if !HAVE_ROUNDstatic av_always_inline av_const double round(double x){return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);}#endif#if !HAVE_ROUNDFstatic av_always_inline av_const float roundf(float x){return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);}#endif#if !HAVE_TRUNCFstatic 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:androidprojectsplayerjniffmpeg目录下的config.h中的内容


#define restrict restrict改为


#define restrict

5、编译ffmpeg

在bash里输入


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

五、后续工作

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

六、mk文件下载

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

七、参考链接

http://www.cnblogs.com/scottwong/archive/2011/01/01/1909455.htmlhttp://abitno.me/compile-ffmpeg-android-ndk
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: