创建博客 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

邹爷的博客

Call Of Duty

 
 
 

日志

 
 
关于我

我是开源的支持者,长期使用Linux。我非常喜欢接触开源技术。 从后台开发到前台设计都涉及过,自学过很多课外知识。 我对后台程序开发以及服务器管理的工作非常感兴趣。 也学了很多有关Java和PHP开源架构的技术。

LOFTER精选

Windows XP、Cygwin、NDKr5b编译Android下的ffmpeg  

2011-12-03 01:21:30|  分类: Android |  标签: |举报 |字号 订阅

Eclipse配置NDK_R4开发环境(集成Cygwin 、CDT)

eclipse 配置 Cygwin NDK环境:
E:\cygwin\bin\bash.exe
E:\cygwin\bin
--login -c "cd /cygdrive/g/android_work/Gexin_Android/jni && $NDK/ndk-build"

$NDK:表示在Cygwin下设置ndk安装目录的环境变量

历经挫折和摧残,终于成功在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 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,运行之后,如下图所示:

image

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

image

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

image

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

image

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

image

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

image

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

image

 

image

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路径是否设置正确,运行后控制台会变成下面的样子:

image

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,恭喜你完成了第一阶段的工作,真不容易啊

image

四、编译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完之后会显示如下图:

image

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

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
  评论这张
 
阅读(744)| 评论(1)
推荐 转载

历史上的今天

最近读者

热度

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014