衡阳APP开发|网络电视APP开发

2019-08-03 标签:网络电视APP 浏览数:76

摘要: 以Android作为软件系统,开发了一款网络电视APP,该APP软件由网络传输模块、解码模块、播放模块以及UI设计模块组成。提出了软件需求分析,并在需求分析的基础上提出总体的软件结构并设计了相应的模块,模块间协同作用实现了软件功能。软件设计完成后,在基于Cortex-A8处理器的手机硬件平台上进行了软件的功能测试和性能测试。

资讯主图

Cortex-A系列处理器是以ARMv7架构为基础开发的最新ARM处理器,其广泛应用于消费类电子产品中。目前风靡全球的三星Galaxy S3就是采用了Cortex-A9四核处理器,可见Cortex-A系列处理器的应用范围是相当广阔的。该系列微处理器囊括了高性能的Cortex-A15、可伸缩的Cortex-A9、经市场考验的Cortex-A8以及高效的Cortex-A7[1]。此外,操作系统方面,Android是一种基于Linux内核的操作系统,在智能手机操作系统中的市场占有率已经超过70%。该系统采用Software Stack架构,底层由C语言开发的Linux内核作为基础,提供基本的功能;中层则转由C++开发出虚拟机和函数库等,用以对上层应用程序提供良好的支持;最上层是各式各样通过JAVA开发的应用程序[2]

本文将就Cortex-A8作为硬件平台,Android作为软件操作系统,开发一款互动性极强的电视客户端APP软件。


1 APP开发需求分析

软件主要以实现视频播放功能为主,体现在能够流畅地在手机网络条件下观看网络电视。由于安卓系统的智能机不像iPhone手机那样具有统一的硬件配置,其处理器运算能力参差不齐,故客户端在实现功能的基础上必须充分考虑其适用范围,尽可能地适配各种运算能力的手机[3]。同时,客户端是实现网络电视功能,故而必须保证能够在常规网络的情况下流畅地播放视频。


2 总体结构设计

客户端的总体规划上采用模块化的设计方案,依次由网络传输协议模块、解码模块和播放模块组成。

用户通过WAP登录服务器选择想要观看的视频,接收到用户的选择信息之后,流媒体管理平台将流媒体的地址通过SDP协议发送到手机电视客户端,手机客户端根据该地址经由RTSP协议向流媒体服务平台请求音频和视频数据流。服务器在接到请求后通过RTP协议将流媒体数据实时地传输给安卓客户端,在传输过程中,RTCP协议实时地监控着传输质量,并将结果反馈给服务器,对RTP的传输过程进行动态调节[4]


3 网络传输协议模块

安卓客户端APP的首要问题是解决视频数据流在网络中的传输难题,目前广泛采用流媒体技术来实现流畅的视频播放功能。流媒体技术顾名思义就是利用流式传输的方式在互联网上播放的媒体格式,视频在流媒体传输技术的处理下被压缩成一个一个的压缩包,然后通过服务器向用户连续,实时发送;用户在接受到压缩包后,通过设备解压,视频就实时显示出来,从而摆脱了传统的先下载完视频再播放的模式。

流媒体的网络视频协议包括了RTP/RTCP,RSVP和RTSP等。TCP/IP协议栈中包含了这些协议。因此,可以直接应用RTP/RTCP,RSVP和RTSP等协议来进行客户端的设计。


4 解码模块

4.1 选择合适的压缩标准

在高速网络视频协议支持的基础上,为了提高视频传输的实时性,达到移动电视节目实时收看的要求,视频的编码压缩也起着至关重要的作用。目前的视频压缩标准主要分为两类,一类是由国际电信联盟远程通信标准化组(ITU-T)的视频编码专家组(VCEG)制定的 H 系列,其中包含了 H.261、H.263、H.263+和H.264 等标准;另一类则是由国际标准化组织(ISO)和国际电工委员会(IEC)组建的活动图像专家组(MPEG)制定的 MPEG 系列,包括了MPEG-1、MPEG-2和 MPEG-7 等标准。H.264标准以其高压缩性和网络亲和性占领了网络上视频点播和视频直播的半壁江山。H.264标准在流媒体业务中的广泛使用使其成为Android移动电视客户端APP的不二选择。

4.2 移植FFmpeg

在确定了压缩标准的基础上,更为重要的是选择一种移植性强,并能够录制、转换和流化音视频的完整解决方案。这时,FFmpeg成为首选,它是基于linux开发的开源软件,具有很高的可移植性。为了能够适应在Cortex-A9系列处理器上面的运行,需要对FFmpeg进行移植和功能裁剪。

首先,在Windows环境下安装Cygwin软件建立交叉编译环境,或者直接在Ubuntu系统环境下进行操作。在建立好编译环境的基础上就可以利用FFmpeg 0.7.1开源项目和Android NDK r5c开发工具进行移植。通过修改FFmpeg的配置脚本文件config.sh中的各个参数,可以根据具体需要对体系架构、编译器、编解码器等进行配置,编译器根据该文件提供的宏定义等信息对源文件进行选择性的代码编译,从而获取指定平台下的可执行程序。config.sh文件的部分内容如下所示:

由于并不需要FFmpeg的所有功能,所以只需根据本工程需要移植FFmpeg的avutil(基础模块),avcodec(音视频编码模块)和avformat(音视频解析模块)即可。这时在libavutil(公共工具函数库),libavcodec(音视频编解码函数库),libavformat(demuxers和muxer函数库)的目录下创建Android.mk文件。在libavutil,libavcodec和libavformat目录下的Android.mk相差不多,libavcodec目录下的Android.mk文件如下所示:

#下面设置编译路径

LOCAL_PATH := $(call my-dir)

include $(LOCAL_PATH)/../av.mk

include $(CLEAR_VARS)

#下面设置源文件路径

LOCAL_SRC_FILES := $(FFFILES)

LOCAL_C_INCLUDES :=\<FounderNode name="@硬" value=""/>〗 $(LOCAL_PATH)\<FounderNode name="@硬" value=""/>〗 $(LOCAL_PATH)/..

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_CFLAGS += $(FFCFLAGS)

#下面指定编译模块

LOCAL_MODULE := %(FFNAME)

#BUILD_SHARED_LIBRARY指定给GNU Makefile的脚本文件

include $(BUILD_STATIC_LIBRARY)

在完成每个模块的Android.mk编写后,需要在FFmpeg的目录下建立Android.mk文件,将上述三个模块编译成libaffmpeg.so的动态链接库。在此基础上,在cywin编译环境中执行$NDK_ROOT进行编译,完成移植编译工作。FFmpeg的Android.mk文件如下所示:

#下面设置编译路径

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#指定libavutil,libavcodec,libavformat这三个需要的编译模块

LOCAL_MODULE :=ffmpeg

LOCAL_WHOLE_STATIC_LIBRARIES :=libavformat libavcodec libavutil

include $(call all-makefiles -under, $(LOCAL_PATH))

include $(BUILD_SHARED_LIBRARY)

4.3 应用FFmpeg实现解码

本系统应用Android NDK移植的FFmpeg,直接移植libavcodec库中已有的H.264视频解码器模块,从而可以调用FFmpeg的内置函数进行想要的解码操作。调用的函数如图1所示。

图1 解码流程

在这一解码过程中,首先使用av_register_all()注册容器格式,然后利用av_find_stream_info0提取视频中的流信息,在获得想要的流信息后,avcodec_find_decoder()函数找到对应的解码器,avcodec_open0函数打开这个解码器,然后avcodec_alloc_frame()函数为解码帧分配内存。avcodec_get_fram()从缓存区中提取数据给avcodec_decode_vide()函数解码,解码完成后,由av_set_frame()函数将数据放入待播放区。最后av_has_next_frame()函数判断是否还有待解码的帧,若有,则跳转到avcodec_get_fram()函数提取新的数据;若无,则跳转到avcodec_close()函数,关闭解码器。


5 播放模块

5.1 播放功能的设计

Android的多媒体核心OpenCore提供了媒体播放器的功能,其中包含了MediaPlayer类,可以利用MediaPlayer来播放需要的网络流媒体。首先,创建一个MediaPlayer对象,再通过调用getVideoHeight() 函数和getVideoWidth() 函数设置视频播放窗口的高度和宽度,以适应具体的手机屏幕。由于MediaPlayer类已经具备了播放、暂停、停止等基本的播放器功能,可以调用Mediaplayer的相应头文件中的内容来实现这些功能,大大简化了设计工作。网络流媒体的缓冲播放功能实现的相关代码如下:

String play_address = “rtsp://127.0.0.1:554/media.sdp”; /*设置流媒体源的网络地址*/

MediaPlayer testPlayer = new MediaPlayer(); /*新建一个播放器testPlayer*/

testPlayer.setDataSource(play_address); /*setDataSource设置了一个MediaPlayer的数据源*/

testPlayer.setOnBufferingUpdateListener(this); /*setOnBufferingUpdateListener设置缓存*/

testPlayer.prepare(); /*准备*/

testPlayer.start(); /*开始播放*/

5.2 UI界面的设计

目前Android的UI设计方法主要分为3种:通过XML配置生成、通过用户界面接口生成和直接代码生成。笔者选用配置XML的方法来生成所要的UI界面。main.xml的部分代码如下:

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/andriod” /*main.xml文件将布局框架指定为LinearLayout线性布局*/

android:layout_width=”fill_parent” /*设置屏幕显示的宽度*/

android:layout_height=”fill_parent” /*设置屏幕显示的高度*/

android:orientation=”horizontal”> /*设置屏幕显示的方向*/


6 测试分析

6.1 测试环境

正如需求分析中所述,为了能够适用于绝大多数的智能手机,笔者选用较早推出的智能手机,其硬件配置较低,如果能够在这样的硬件平台上面流畅运行,说明软件的适配性非常不错。所以笔者选用了HTC公司于2010年推出的畅销智能手机HTC G7(Cortex-A8处理器,ARMv7构架,578 Mbyte内存)作为硬件平台;选用Android2.2作为客户端的软件操作系统。HTC G7支持WLAN功能和蓝牙功能,网络模式支持GSM、WCDMA等。笔者选用中国移动的WCDMA网络作为测试网络。

6.2 性能测试

在客户端APP运行过程中,能够流畅地观看视频,笔者测试了暂停和停止功能,功能实现基本没有问题,手机在播放过程中如图2所示。

图2 客户端APP运行(照片)

在功能测试的基础上,笔者测试了CPU的使用情况,手机的内存占用情况用以标定客户端对于处理器硬件配置的要求;同时测试客户端运行过程中的网络传输情况,用以标定客户端对网络的要求。

Cortex-A8处理器的CPU使用率如图3所示,当客户端开始运行时,CPU的使用率呈线性增加的势头,最后稳定在50%左右,CPU使用率并不是很高。此外,ARM公司在继Cortex-A8系列处理器之后又推出了功能更加强劲的Cortex-A9以及Cortex-A15等处理器,这些处理器的性能都优于Cortex-A8,本客户端能够在Cortex-A8处理器上流畅地运行,由此可见客户端对CPU性能的要求还是比较令人满意的。

图3 客户端播放时的CPU使用情况(截图)

内存使用情况如图4所示,由图可见,内存使用率高达66%,内存剩余空间太少,基本没有运行其他大型程序的空间。故客户端对内存的需求比较大,内存成为此电视客户端发展的一个瓶颈。所幸现在的手机市场发展迅速,新推出的Android或者其他操作系统(IOS,WP8)的手机都具备较大内存(1 Gbyte或者2 Gbyte)的硬件配置,内存短缺的情况基本得到缓解。但如何减小内存占用,也是本客户端必须解决的当务之急。

图4 客户端播放时的内存使用情况(截图)

如图5所示为客户端运行过程中的WCDMA网络传输速度情况,可以看到,在视频播放过程中,接收服务器数据包的速率持续高达1 000 kbit/s左右,而发送给服务器的数据包的传输速率则很低,只有不到6 kbit/s。这是由于在播放视频时客户端主要的数据流是接收服务器端发过来的数据包,发送出去的数据只是少量的,起反馈信息的作用。如今的3G发展迅猛,4G时代也已经到来,本客户端对于网络条件的需求完全可以得到满足。

从测试的结果来看,客户端能够在现在广泛被市场认可的Cortex-A8处理器上面流畅地运行,CPU使用情况和内存占用情况都比较令人满意,显示了本客户端的适用性还是很不错的,能够适配大多数的智能手机,同时视频播放过程中的网络数据传输速率也能够得到现今网络的支持。

图5 客户端播放时的网络传输情况(截图)


7 结论

本文以Cortex-A系列微处理器为硬件平台,设计了一个基于Android2.2版本操作系统的网络电视客户端APP。文中针对客户端设计过程中的具体要求,选择了合适的网络传输协议和编码压缩标准,然后移植了FFmpeg,利用其强大的编码解压功能,将网络传输的数据包进行解码。对于解码后的数据,笔者运用了Android的多媒体核心OpenCore中的MediaPlayer类对视频进行播放和暂停等功能,并设计了相应的UI界面,方便用户操作。米维信息认为随着当代网络技术的飞速发展和Android智能手机的迅速普及,基于Cortex-A系列微处理器的移动电视客户端APP必将迎来广阔的发展前景。


关键字: 衡阳APP开发,网络电视APP

衡阳网站建设,APP开发活动入口
相关资讯
热门资讯
提供衡阳微信小程序开发,微信营销功能开发、公众号开发等开发服务