ffmpeg on Android

来源:互联网 发布:国家税务电子申报软件 编辑:程序博客网 时间:2024/04/29 17:57

最近在做将ffmpeg移植到Android上的工作,主要目的是使用ffmpeg解码和多种协议的支持能力,播放http传输的流。当然porting的介绍网上很多了,而且我也没有做这个工作,我就介绍一下我遇到的几个小问题吧。

1,生成config.h文件之后,不要忘记将其中的#define restrict restrict改为#define restrict否则编译不过,由于arm的编译器不支持restrict关键字

2,需要加入http的支持,本来以为在configure中加入--enable-procotal=http即可,但是并没有将http编译进入,那么就更改config.h及config.mak中关于http的相关宏,使其enable即可。http的代码在avformat模块的http.c中。

3,在ffmpeg的代码中加入android的log支持即c/c++代码的log支持,这个网上也有很多介绍。基本就是如下:

#include <android/log.h>
#define LOG_TAG ""yourmodule""
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,__VA_ARGS__)

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO  , LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN  , LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , LOG_TAG"",__VA_ARGS__)
然后在需要地方使用LOG相关宏即可,由于我在http.c中加入的log,在编译时有些错误,说是有些network相关的符号重复定义,后来删除代码中的#include "network.h"即可。然后在makefile中加入-llog,关于-llog的加入颇费了一番周折,开始我将其加入到LOCAL_LDLIBS := -llog中,但是有一个link的错误 undefined reference to `__android_log_print'  error,后来比较其他例子和我的代码发现不同点是,所有的其他例子生成的都是共享库如下<include $(BUILD_SHARED_LIBRARY)>,而我的代码生成的是静态库如下<include $(BUILD_STATIC_LIBRARY)>,也许问题就是出现在链接方式上,改为shared的方式那么错误没有了,但是出现了其他的错误,后来经过阅读Android的Make说明,发现使用如下方式加入-llog即可,<LOCAL_EXPORT_LDLIBS := -llog>。


4,还有就是需要调试http的stream,如果使android emulator访问到我的开发机哪,后来发现使用10.0.2.2这个IP即可,原理emulator有个机制,会将10.0.2.2映射到开发机,具体可以参见文档Android Emulator -- Network Address Space。


http播放并没有调试成功,先共享这些内容吧。


2011-11-12

想要支持http协议光enable http还不行,在configure中可以看到,http还依赖tcp,所以还需要把tcp enable,这样就可以了。


2011-11-17

还得补充一下,android的应用程序要想访问网络需要进行一下设置的。

AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />


编译ffmpeg也可以不用那么费事,可以借鉴Rockplayer项目的成果,直接使用Rockplayer中的 build_andriod.sh ,当然编译出来的ffmpeg.so要在android项目中引用还需要一点工作,具体我在其他的地方介绍。点击打开链接

原创粉丝点击