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,下面是完整的编译过程,下面是详细的过程:
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,有兴趣的同学可以研究一下
2)输入bash,如果提示“'bash'
注意:Cygwin和Mingw不一样,本地磁盘前面有/cygdrive/前缀
me!
2)运行CMD,在DOS提示符下输入
切换到工程路径
如果提示如下错误字符串:
请检查你的NDK SDK路径是否设置正确,仔细检查一下,肯定是错的。如果出现下面的错误提示:
表示NDK SDK路径对了,但需要设置一下TMPDIR路径,在bash里输入
SDK带的文档,要顺利编译ffmpeg需要以下几个mk文件:1)E:androidprojectsPlayerjni文件夹下,即ffmpeg文件夹的父目录下,文件名为Android.mk,内容如下:
编辑 libavcodec、libavfilter、libavformat、libavutil、libpostproc 和
libswscale 目录中的 Makefile 文件,删除
和
r5b下成功编译了ffmpeg,下面是完整的编译过程,下面是详细的过程:
一、准备工作
2、下载Cygwin, 请猛击这里3、下载Android SDK,请猛击这里,AndroidSDK的网页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,所以必须得先配置SDK1)将下载到的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,我该如何编译呢,followme!
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规范,具体请参考NDKSDK带的文档,要顺利编译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
相关文章推荐
- Windows XP自动开关机的实现
- 经验交流:Windows XP文件夹和打印…
- Windows XP 常见进程
- 让Windows XP中的IIS支持多站点的…
- Windows XP + PHP 5.1.4 + MySQL …
- 新手学习 如何加快Windows XP启动…
- PHP在windows xp下的安装
- 打造Windows 7+Windows XP SP3+DOS…
- [转]Cygwin, sshd and Windows 7
- Windows XP 无法共享
- 两步解除盗版Windows XP警告---WGA…
- 【原创】windows xp squ…
- Windows XP Mode 中文正式版下载 (…
- 番茄花园 Windows XP Pro SP2 免激…
- WINDOWS XP启动控制面板命令大全
- Windows XP & VMware GSX 3.0下安装声卡测试
- 连破6台1.1.1 Windows破解教程图文版
- Windows XP & VMware GSX 3.0下安装声卡测试
- Windows下使用VIM&Cygwin,搭建Mainframe开发环境(六)---用awk/sed合并PLI/Cobol编译结果
- Windows Server 2008虚拟技术