APPRO IPNC方案 Android手机监控客户端---ffmpeg移植

以下所有操作均在Ubuntu 10.04 LTS OS上进行

1 环境配置

Ubuntu下Android开发环境的搭建:

http://www.cnblogs.com/softman11/archive/2011/06/22/2086793.html

Ubuntu下安装Android NDK :

http://blog.csdn.net/jumping_android/article/details/7403322

本人JDK安装目录为:

/ipnc_dev/Android/jdk1.6.0_26

Adroid SDK安装目录为:

/ipnc_dev/Android/android-sdk-linux

NDK安装目录为:

/ipnc_dev/Android/android-ndk-r8c

~/.bashrc文件配置为

[plain]  view plain copy print ?
  1. #for andriod developer  
  2. export JAVA_HOME=/ipnc_dev/Android/jdk1.6.0_26  
  3. export JRE_HOME=/ipnc_dev/Android/jdk1.6.0_26/jre  
  4. export PATH=/ipnc_dev/Android/jdk1.6.0_26/bin:$PATH   
  5. export CLASSPATH=.:/ipnc_dev/Android/jdk1.6.0_26/lib:/ipnc_dev/Android/jdk1.6.0_26/jre/lib  
  6. export PATH=/ipnc_dev/Android/android-ndk-r8c:$PATH  

2 ffmpeg移植

在/ipnc_dev/Andriod目录下创建文件夹Player,切换到Player目录下,使用下列命令创建一个标准的Android项目ipncPlayer

[plain]  view plain copy print ?
  1. /ipnc_dev/Android/android-sdk-linux/platforms/tools/android create project -n ipncPlayer -t 8 -p ipncPlayer -k art.abitno.ipncplayer -a PlayerView  
然后在ipncPlayer目录里创建jni目录,切换到jni目录下,将Appro IPNC参考设计中的FFMPEG源码复制到该目录下(在原源码中,我自己做了很多修改,主要是内存泄漏相关的,经测试,使用新版本的ffmpeg时,MJPEG码流可以正常播放,但是H.264和MPEG4码流不能打开),该源码是使用经GoDB开发人员使用ffmpeg 0.52源码在windows上修改过的,所以要在移植到Android上,可以先在linux进行编译,看能否通过,之前本人在linux下修改编译通过,具体修改哪几部分源码忘记了,rtsp.c queue.c中修改的比较多,貌似都是关于线程方面的,在linux下使用pthread库函数替代即可.

此时的目录结构如下图所示


切换到FFMPEG目录下,新建一个andriod.config文件,内容如下

[plain]  view plain copy print ?
  1. #!/bin/bash  
  2. PREBUILT=/ipnc_dev/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86  
  3. PLATFORM=/ipnc_dev/Android/android-ndk-r8c/platforms/android-14/arch-arm  
  4. ./configure --target-os=linux \  
  5. --extra-cflags="-fPIC -DANDROID" \  
  6. --extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-linux-androideabi/4.6/crtbegin.o $PREBUILT/lib/gcc/arm-linux-androideabi/4.6/crtend.o -lc -lm -ldl" \  
  7. --arch=arm \  
  8. --enable-cross-compile \  
  9. --enable-armv5te \  
  10. --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \  
  11. --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \  
  12. --nm=$PREBUILT/bin/arm-linux-androideabi-nm \  
  13. --enable-version3 \  
  14. --enable-gpl \  
  15. --enable-nonfree \  
  16. --disable-stripping \  
  17. --disable-ffmpeg \  
  18. --disable-ffplay \  
  19. --disable-ffserver \  
  20. --disable-asm \  
  21. --enable-neon \  
  22. --enable-shared \  
  23. --disable-debug \  
  24. --enable-small \  
  25. --enable-static \  
  26. --disable-muxers \  
  27. --enable-muxer=avi \  
  28. --enable-demuxer=avi \  
  29. --enable-demuxer=rtsp \  
  30. --enable-demuxer=http \  
  31. --disable-bsfs \  
  32. --disable-devices \  
  33. --disable-encoders \  
  34. --enable-encoder=h264 \  
  35. --enable-encoder=mpeg4 \  
  36. --enable-encoder=mjpeg \  
  37. --enable-encoder=pcm_mulaw \  
  38. --enable-encoder=aac \  
  39. --disable-decoders \  
  40. --enable-decoder=h264 \  
  41. --enable-decoder=mpeg4 \  
  42. --enable-decoder=mjpeg \  
  43. --enable-decoder=pcm_mulaw \  
  44. --enable-decoder=aac  
使用命令 chmod +x android.config添加文件执行权限,终端下运行./android.config进行ffmpeg编译配置,编译配置完成后,打开FFMPEG目录下config.h,

将代码

  1. #define restrict restrict  
修改为
  1. #define restrict  
据说是Android的GCC不支持restrict关键字,没有亲自测试过.

编辑libavutil/internal.h,把其中的static方法前的static关键字删除.

分别修改libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale下的Makefile,把下面两句删除

include $(SUBDIR)../subdir.mak
include $(SUBDIR)../config.mak

注意这两行并不是连续的.

在FFMPEG目录下添加一个文件ffmpeg.mk,内容如下:

[plain]  view plain copy print ?
  1. #LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale  
  2. #  
  3.   
  4. #include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak  
  5. include $(LOCAL_PATH)/../config.mak  
  6.   
  7. OBJS :=  
  8. OBJS-yes :=  
  9. MMX-OBJS-yes :=  
  10. include $(LOCAL_PATH)/Makefile  
  11. #collect objects  
  12. OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)  
  13. OBJS += $(OBJS-yes)  
  14. FFNAME := lib$(NAME)  
  15. FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))  
  16. FFCFLAGS  = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign  
  17. FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"  
  18. ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)  
  19. ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))  
  20. ifneq ($(ALL_S_FILES),)  
  21. ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))  
  22. C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))  
  23. S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))  
  24. else  
  25. C_OBJS := $(OBJS)  
  26. S_OBJS :=  
  27. endif  
  28.   
  29. C_FILES := $(patsubst %.o,%.c,$(C_OBJS))  
  30. S_FILES := $(patsubst %.o,%.S,$(S_OBJS))  
  31. FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))  
接下来添加一系列的Android.mk,在jni根目录下的内容如下:

[plain]  view plain copy print ?
  1. include $(all-subdir-makefiles)  
FFMPEG目录下的Android.mk内容为:

[plain]  view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale  
  4. LOCAL_MODULE := ffmpeg  
  5. include $(BUILD_SHARED_LIBRARY)  
  6. include $(call all-makefiles-under,$(LOCAL_PATH))  
libavformat/Android.mk内容为:

[plain]  view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. include $(LOCAL_PATH)/../ffmpeg.mk  
  4. LOCAL_SRC_FILES := $(FFFILES)  
  5. LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/..  
  6. LOCAL_CFLAGS += $(FFCFLAGS)  
  7. LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex  
  8. LOCAL_LDLIBS := -lz  
  9. LOCAL_STATIC_LIBRARIES := $(FFLIBS)  
  10. LOCAL_MODULE := $(FFNAME)  
  11. include $(BUILD_STATIC_LIBRARY)  
libavcodec/Android.mk内容为:

[plain]  view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. include $(LOCAL_PATH)/../ffmpeg.mk  
  4. LOCAL_SRC_FILES := $(FFFILES)  
  5. LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/..  
  6. LOCAL_CFLAGS += $(FFCFLAGS)  
  7. LOCAL_LDLIBS := -lz  
  8. LOCAL_STATIC_LIBRARIES := $(FFLIBS)  
  9. LOCAL_MODULE := $(FFNAME)  
  10. include $(BUILD_STATIC_LIBRARY)  
libavfilter、libavutil、libpostproc和libswscale下的Android.mk内容为:

[plain]  view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. include $(LOCAL_PATH)/../ffmpeg.mk  
  4. LOCAL_SRC_FILES := $(FFFILES)  
  5. LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/..  
  6. LOCAL_CFLAGS += $(FFCFLAGS)  
  7. LOCAL_STATIC_LIBRARIES := $(FFLIBS)  
  8. LOCAL_MODULE := $(FFNAME)  
  9. include $(BUILD_STATIC_LIBRARY)  
修改 NDK目录中/build/gmsl/ __gmsl文件的第512行 :

[plain]  view plain copy print ?
  1. int_encode = $(__gmsl_tr1)$(wordlist 1, $1,$(__gmsl_input_int))  
修改为:

[plain]  view plain copy print ?
  1. int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))  

否则ndk-build时出现"android-ndk-r8c/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist' function: '"错误.

最后在jni目录下运行ndk-build进行编译.

本文主要参照blog:http://blog.sina.com.cn/s/blog_51396f890102dxdn.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值