欢迎来到天天文库
浏览记录
ID:5370976
大小:259.81 KB
页数:11页
时间:2017-12-08
《基于android平台的ffmpeg的移植和应用》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、基于Android平台的ffmpeg的移植和应用张寅昊江苏润和软件股份有限公司E-mail:zhang_yinhao@hoperun.com摘要:随着Android平台引爆新的潮流,Android上的应用也火热起来。为了弥补Android平台本身对多媒体支持的薄弱,本文介绍了将目前成熟的开源多媒体框架ffmpeg移植到Android中的技术要点。关键词:Android,ffmpeg,ffserver,jni,makefile,ndk,多媒体1引言随着Google公司2007年11月5日宣布新一代基于lin
2、ux平台的开源手机操作系统名称为Android后,短短几年,Android系统便引爆了移动互联网的热潮。2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。采用Android系统主要厂商包括中国台湾的HTC(第一台谷歌的手机G1由HTC生产代工)、韩国三星、韩国原道、美国摩托罗拉、索尼爱立信等,中国大陆厂商如:首派(A101、A100、
3、A80、A60S及未上市的A70),魅族(M9),华为、中兴、联想、蓝魔等。本论文基于公司项目,因为Android本身的多媒体框架opencore支持的视频格式只有3gp和mp4两种,因此项目将移植ffmpeg来扩展android平台编解码,并利用ffserver作为流媒体服务器,以实现通过摄像头拍摄的视频能直接远程连接观看。论文将着重讲解ffmpeg的移植,jni的调用,ffserver的配置以及ffmpeg和ffserver间的通信。2项目设计2.1项目总体结构图PC播放或其它网络设备传输编码手机端c
4、amera采集2.2各部分详细说明2.2.1采集通过Android摄像头采集原始数据。摄像头数据的采集共有两种方法。一是利用ffmpeg的v4l2接口,找到系统的摄像头文件,在Linux系统中,摄像头文件一般为/dev/video0,但在Android系统中各厂商的通常自己实现摄像头得驱动,因此摄像头文件都不一样,这样如果使用ffmpeg的v4l2接口从底层抓取数据的话,就会造成软件的通用性变差,故弃而不用。Android中另一种取得摄像头数据的方法是通过上层Google提供的统一API,在摄像头的Pre
5、view通过回调函数onPreviewFrame可以得到原始数据,一般是yuv420sp。2.2.2编码在java层得到的数据,通过jni传递给c层,在c层调用ffmpeg对其编码。2.2.3传输传输前先要启动ffserver,然后调用ffmpeg将视频流化后传给ffserver。2.2.4播放Ffserver接受视频流后将其存储在feed1.ffm中,当网络上或者本地有播放请求时进行播放。3ffmpeg的移植FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依
6、据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。3.1Android.mk的编写Android.mk是makefile的一小部分,用来向编译系统描述你的源代码。下面通过一个简单的小例子来解释其语法规则。LOCAL_PATH:=$(callmy-dir)一个Android.mk文件首先要定义好LOCAL_PATH变量,它用于在开发树中查找源文件。在这
7、个例子中,宏函数“callmy-dir”由编译系统提供,用于返回当前路径。include$(CLEAR_VARS)CLEAR_VARS由编译系统提供,指定让makefile帮你清除许多LOCAL_XXX变量(例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等等)。LOCAL_MODULE:=helloworldLOCAL_MODULE变量必须定义,用来标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,且不能包含任何空格。编译系统
8、会自动产生前缀和后缀,例如本例在linux下会产生libhelloworld.so,在windows下会产生libhelloworld.dll文件。如果你把库命名为libhelloworld的话,那它还是会产生libhelloworld.so文件。LOCAL_SRC_FILES:=helloworld.cLOCAL_SRC_FILES变量必须包含将要编译打包进模块中的c或c++文件。Include$(BUILD_SHARED_
此文档下载收益归作者所有