基于Android的弹幕视频播放软件的 设计与实现

2019-05-11 10:34:23      点击:

基于Android的弹幕视频播放软件的设计与实现

摘要:近年来,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。

Android系统的出现,给移动互联网时代带来了新的发展。为了适应现代信息时代网络在线的需求,采用新信息技术,研究设计了一个基于android的弹幕视频播放软件。论文首先介绍了基于android的弹幕视频播放软件的现状及开发背景,然后论述了系统的设计目标,系统需求和总体设计方案,较详细的论述了系统的详细设计和实现,最后对基于android的弹幕视频播放软件进行了一些具体测试。

基于android的弹幕视频播放软件分为两大模块,用户可以上传视频、发布弹幕等;管理员可以进行用户管理、视频管理等。本系统采用了JAVA、ANDROID、JSP技术,Mysql数据库,完成了整个开发过程。

关键词:Android;弹幕视频播放软件;Java










 DESIGN AND DEVELOPMENT OF BULLET SCREEN VIEDO PLAYER SOFTWARE BASED ON ANDROID

   Abstract:In recent years, with the continuous development of society and progress, people for the understanding of the scientific information that has been developed from low level to high level development, from perceptual knowledge to rational knowledge, the importance of management work has been gradually known by people, scientific management, to store information accurate, fast, perfect, and can improve the work efficiency of management, promote its development.

The emergence of Android system has brought new development to the era of mobile Internet. In order to adapt to the online demand of modern information age and adopt new information technology, research and design a bullet screen video player software based on android. This paper first introduces the status quo and development background of android based bullet screen video player software, then discusses the design objectives, system requirements and overall design scheme of the system, discusses the detailed design and implementation of the system in detail, and finally carries out some specific tests on the android based bullet screen video player software.

The android-based bullet screen video player software is divided into two modules. Users can upload video and release bullet screen. The administrator can carry on the user management, video management and so on. This system USES JAVA, ANDROID, JSP technology, Mysql database, completed the entire development process.


Keywords:Android ; Bullet Screen Video Player Software ; Java


目录

TOC \o "1-3" \h \u1绪论..................................................................................................................................................PAGEREF _Toc8419658 \h2

2系统开发环境..................................................................................................................................PAGEREF _Toc8419659 \h2

2.1 JAVA技术............................................................................................................................PAGEREF _Toc8419660 \h2

2.2 Android Studio介绍.............................................................................................................PAGEREF _Toc8419661 \h2

2.3 Android系统简介.................................................................................................................PAGEREF _Toc8419662 \h3

3系统分析..........................................................................................................................................PAGEREF _Toc8419663 \h3

3.1系统流程设计........................................................................................................................PAGEREF _Toc8419664 \h3

3.1.1系统登录流程............................................................................................................PAGEREF _Toc8419665 \h3

3.1.2系统操作流程............................................................................................................PAGEREF _Toc8419666 \h4

3.1.3添加信息流程............................................................................................................PAGEREF _Toc8419667 \h5

3.1.4修改信息流程............................................................................................................PAGEREF _Toc8419668 \h6

3.1.5删除信息流程............................................................................................................PAGEREF _Toc8419669 \h6

3.2系统用例分析........................................................................................................................PAGEREF _Toc8419670 \h7

3.2.1管理员用例图.............................................................................................................PAGEREF _Toc8419671 \h7

3.3.2用户用例图.................................................................................................................PAGEREF _Toc8419672 \h7

4系统设计..........................................................................................................................................PAGEREF _Toc8419673 \h8

4.1系统概述...............................................................................................................................PAGEREF _Toc8419674 \h8

4.2系统结构设计.......................................................................................................................PAGEREF _Toc8419675 \h8

4.3数据库设计............................................................................................................................PAGEREF _Toc8419676 \h9

4.3.1数据库设计原则........................................................................................................PAGEREF _Toc8419677 \h9

4.3.2数据库实体................................................................................................................PAGEREF _Toc8419678 \h9

4.3.3数据库表设计..........................................................................................................PAGEREF _Toc8419679 \h11

5主要代码解析.................................................................................................................................PAGEREF _Toc8419680 \h11

5.1视频功能模块的实现.........................................................................................................PAGEREF _Toc8419681 \h11

5.1.1视频的注册于登陆..................................................................................................PAGEREF _Toc8419682 \h11

5.1.2注册信息界面...........................................................................................................PAGEREF _Toc8419683 \h14

5.1.3系统首页界面...........................................................................................................PAGEREF _Toc8419684 \h17

5.1.4视频播放...................................................................................................................PAGEREF _Toc8419685 \h19

5.1.5发布弹幕界面...........................................................................................................PAGEREF _Toc8419686 \h20

5.1.6个人信息管理界面...................................................................................................PAGEREF _Toc8419687 \h21

5.1.7视频发布管理界面...................................................................................................PAGEREF _Toc8419688 \h22

5.2管理员功能模块的实现......................................................................................................PAGEREF _Toc8419689 \h25

5.2.1管理员用户管理界面...............................................................................................PAGEREF _Toc8419690 \h25

5.2.2视频管理界面...........................................................................................................PAGEREF _Toc8419691 \h26

6系统测试.........................................................................................................................................PAGEREF _Toc8419692 \h26

6.1系统测试的意义..................................................................................................................PAGEREF _Toc8419693 \h27

6.2性能测试..............................................................................................................................PAGEREF _Toc8419694 \h27

6.3测试分析..............................................................................................................................PAGEREF _Toc8419695 \h28

7结论.................................................................................................................................................PAGEREF _Toc8419696 \h28

致   谢............................................................................................................................................PAGEREF _Toc8419697 \h29

参考文献............................................................................................................................................PAGEREF _Toc8419698 \h30


1绪论

现如今,社会的飞速发展,科技的不断进步,带动着一系列的技术不断前进,智能手机更是得到了极大的发展。随着Android系统的更新换代,由早期的Android 1.1到现如今的Android 9.0,短短10年间,发展十分迅猛,而基于Android系统的软件的开发更是崛起,层出不穷,涉及生活的方方面面,可以说人们的吃穿住行,Android智能手机都能够照顾到。

经济基础决定上层建筑,当人们的生活得到极大的满足时,就会对文化生活有一定的需求,视频播放软件也就应运而生,而后人们在观看视频的同时,也不满足于仅仅观看视频,而是希望能够在观看视频的同时,发表自己的观点。弹幕视频播放软件就是基于此而开发出来的,具有很高的使用价值。

本课题专门对系统进行了分析,其中包括系统的需求分析、系统的流程分析以及系统开发的可行性分析等;本次设计工作中主要完成了安卓客户端的开发。系统的设计主要是以客户需求为核心,从系统的框架以及系统的具体功能进行设计。

2系统开发环境 

2.1JAVA技术

Java是一种跨平台的应用软件可以写面向对象的编程语言,不仅仅吸收了C++语言的各种优点,并且摒弃了C++里面让人难以理解的多继承、指针等概念,所以Java具有功能强大以及简单易上手两个特征。Java作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java由四个方面组成:Java编程语言Java,Java类文件格式,Java虚拟机和Java应用程序编程接口(Java API)。

与传统的程序不同,Sun公司场合,Java将推出作为一个开放的技术。Java千上万的开发公司被要求Java软件的设计必须互相兼容。”Sun公司口号之一是“Java语言非依靠群体的力量而是公司的力量”。赢得了软件开发商的多数同意。这与强调精注重英和封闭的模式是完全不同的。

Sun的Java编程语言解释器:Java编程语言是一种简单的,面向对象的,分布式的,解释的,健壮的,安全的系统独立的,便携式的,高性能,多线程和动态的语言。

在Java平台是基于Java语言的平台。这个平台是非常受欢迎的。因此,微软公司推出的对手,NET平台和C#语言模仿Java。

2.2Android Studio介绍

Android Studio是谷歌推出的一个Android集成开发工具,2013年5月16日,在I/O大会上,谷歌推出新的Android开发环境——Android Studio,并对开发者控制台进行了改进。

Android Studio是谷歌推出了新的Android开发环境,开发者可以在编写程序的同时可以看到自己的应用在不同尺寸屏幕中的样子。

Android Studio相对于别的开发软件来说有以下几个优点:首先,它的稳定速度快,使用Eclipse的开发人员都会遇到突然卡顿、内存占用高等一系列问题,而Android Studio在这块性能得到了明显提升,在启动速度上比Eclipse快。其次,Android Studio集合了Eclipse+ADT的优点,并且能够实时展示界面布局效果。并且,Android Studio具有完善的插件管理,整合了Gradle构建工具,也不需要自己打开一个终端来使用ADB等工具,因为它内置终端,相对来说也比较智能。

2.3 Android系统简介

安卓系统是谷歌开发的一款开源的,移动设备的操作系统。它的内核设计是基于linux,内部使用了谷歌公司自己的虚拟机dalvik java虚拟机。

开源性,安卓系统是完全开放的系统,从底层操作到上层视频都不存在障碍,这样平台就会有越来越多的视频使用和开发,有很多视频都设计自己定制性的安卓系统。由此也会让系统更加成熟。

多厂商支持,现在已经有很多大型的厂商都支持其系统,例如三星、华为、小米等等众多厂商。

多元化,安卓是一个操作系统,它不仅在移动设备上使用,而且现在已经扩展到电视、平板、机顶盒等等设备中,使他的使用越来越多元化。

除上述以外,安卓系统还有无界化、易用等等特点,这也使安卓系统成为了现在移动设备使用最多的系统。

3系统分析

基于Android的弹幕视频播放软件主要采用Android开发技术,MYSQL数据库,主要包括前端应用程序的开发以及后台数据库的建立和维护两个方面。对于应用程序的开发要求具备功能要完备、使用应简单等特点,而对于数据库的建立和维护则要求建立一个数据完整性强、数据安全性好、数据稳定性高的库。

3.1系统流程设计

3.1.1系统登录流程

为了保证系统的安全性,要使用本系统对视频移动办公信息进行管理,必须先登陆到系统中。如图3-1所示。


图3-1登录流程图

3.1.2系统操作流程

视频打开系统,首先进入系统登录界面,视频需通过正确的视频名、密码进行登录,系统会进行检查视频登录信息,信息正确则进入对应视频功能界面,可进行功能操作处理,否则提示信息错误,登录失败。基于Android的弹幕视频播放软件操作流程如图3-2所示。



图3-2系统操作流程图

3.1.3添加信息流程

管理员可以对用户信息、视频信息等进行信息的添加,视频也可以对自己权限内的信息进行添加,输入所要添加的信息,系统会自动对信息数据进行验证,信息合法,则验证成功添加至数据库,信息不合法提示添加失败,重新输入信息。添加信息流程如图3-3所示。


图3-3添加信息流程图

3.1.4修改信息流程

管理员可以对用户信息、视频信息等进行信息的修改,视频也可以对自己权限内的信息进行修改,首先进入修改信息界面,输入修改信息数据,系统进行数据的判断验证,修改信息合法则修改成功,信息更新至数据库,信息不合法则修改失败,重新输入。修改信息流程图如图3-4所示。


图3-4修改信息流程图

3.1.5删除信息流程

管理员可以对用户信息、视频信息等进行信息的删除,选中所要删除的信息,单击删除按钮,系统则提示是否确定删除信息,选择确定删除,则删除信息成功,系统数据库将信息进行删除。删除信息流程图如图3-6所示。



图3-5删除信息流程图

3.2系统用例分析

3.2.1管理员用例图

系统中的核心视频是系统管理员,管理员登录后,通过管理员菜单来管理后台系统。主要功能有:用户管理、视频管理等。管理员用例如图3-6所示。


图3-6管理员用例图

3.3.2用户用例图

用户进入系统可以进行视频查看、视频发布、个人信息管理。用户用例如图3-7所示。


图3-7用户用例图

4系统设计

4.1系统概述

基于Android的弹幕视频播放软件使用安卓平台和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要视频能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示:


图4-1系统工作原理图

4.2系统结构设计

系统架构的整体设计是一个将一个庞大的任务细分为多个小的任务的过程,这些小的任务分段完成后,组合在一起形成一个完整的任务。它具体的工作步骤是:

1、系统被分解多个子模块

2、对各个子模块的功能进行预先的设计

3、对各个子模块之间的逻辑关系进行设计

4、对各个模块的界面以及模块间信息的传输进行设计

在整个设计过程,以确定可能的具体方案达成每一个小的最终目标,对于每一个小的目标而言,我们必须先了解一些相关的需求分析的信息。然后对系统进行初步的设计,并对其逐渐进行优化,设计出一个具体可实现的系统框架。

基于Android的弹幕视频播放软件的整体结构设计如图4-2所示。


图4-2系统结构图

4.3数据库设计

数据库是计算机信息系统的基础。信息的收集、整理、存储、检索、更新、加工、统计和传播等操作必须在数据库管理系统的的支持下才能进行。目前,电脑系统的关键与核心部分就是数据库。数据库开发的优劣对整个系统的质量和速度有着直接影响。

数据库的设计一般要可以分为个步骤:分别是分析需求、设计概念、设计逻辑、设计物理。

4.3.1数据库设计原则

在概念设计中,通常用四种方法:

自顶向下、自底向上、逐步扩张、混合策略,以它为骨架集成由自底向上策略中设计的各局部概念结构

在物理结构设计阶段首先分两步走:

确定数据库的物理结构,在关系数据库中主要是指存取方法和存储结构。对物理结构的评价是时间和空间效率。

选取正确的关系模式存取方法,常用的有:存取索引方法、聚簇存取、HASH存取方法等。

4.3.2数据库实体

在此阶段,视频可以参与和评价数据库系统的设计,从而有利于保证数据库系统的设计与视频的需求相吻合。在概念模式的设计中,E-R模型法是最常见的设计方法。

通过上述分析对数据库的需求,与系统概念模型的特点及开发方法相结合,我们可以建立E-R模型图,本系统的E-R图如下图所示:

1、视频信息实体E-R图如图4-3所示:


图4-3视频信息实体图

2、弹幕信息实体E-R图如图4-4所示:


图4-4弹幕信息实体图

3、举报信息实体属性图如图4-5所示:


图4-5举报信息实体属性图

4、用户信息实体属性图如图4-6所示:


图4-6用户信息实体属性图


4.3.3数据库表设计

数据库的设计通常是以一个已经存在的数据库管理系统为基础的,常用的数据库管理系统有SQL SERVER,MYSQL Oracle等。本基于android的弹幕视频播放软件采用了MYSQL数据库管理系统,下面介绍数据库中的各个表的详细信息。

表4-1 shipin视频信息表

列名

数据类型

长度

主键

允许空

说明

id

int

11

主键

name

varchar

255

视频名称

img

varchar

255

图片

date

varchar

255

发布时间

username

varchar

255

用户名

表4-2 comment弹幕信息表

列名

数据类型

长度

主键

允许空

说明

id

int

11

主键

username

varchar

255

用户名

msg

varchar

255

内容

mid

varchar

255

视频ID

shijian

varchar

255

时间

表4-3 jubao举报信息表

列名

数据类型

长度

主键

允许空

说明

id

int

11

主键

name

varchar

255

举报人姓名

msg

varchar

255

举报内容

表4-4 user用户信息表

列名

数据类型

长度

主键

允许空

说明

id

int

11

主键

username

varchar

255

用户名

passwd

varchar

255

密码

roletype

varchar

255

角色

name

varchar

255

姓名

email

varchar

255

邮箱

tel

varchar

255

电话

qq

varchar

255

QQ

sex

varchar

255

性别

birth

varchar

255

生日

img

varchar

255

头像

5弹幕视频播放软件

5.1视频功能模块的实现

5.1.1视频的注册于登陆

视频打开APP输入正确的用户名和密码进行登录。如图5-1所示。


图5-1登录界面

登陆界面的主要代码如下所示:

 @Override

    protected void initData() {

        setContentView(R.layout.a_activity_login);

        ButterKnife.bind(this);

        if(ManagerComm.loginUser != null){

            usernameEt.setText(ManagerComm.loginUser.getUsername());

            passwordEt.setText(ManagerComm.loginUser.getPasswd());

            autoLoginSw.setChecked(true);

        }


             String ip = ManagerConf.readFromLocal("server_ip");

        if(!TextUtils.isEmpty(ip)){

            HttpUtil.ip = ip + ":8080";

            HttpUtil.BASE_URL = "http://" + HttpUtil.ip + "/";

            HttpUtil.BASE_URL_UPLOAD = HttpUtil.BASE_URL + "/upload/";

        }


    }


    @Override

    protected void recycle() {


    }


    @OnClick({R.id.left_tv, R.id.right_tv, R.id.login_btn, R.id.forget_pass_tv, R.id.switch_fun_tv})

    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.left_tv:

                ManagerApp.exitApp();

                break;

            case R.id.right_tv:

                startActivity(new Intent(this_, IpActivity.class));

                break;

            case R.id.login_btn:

                String username = usernameEt.getText().toString().trim();

                String passwd = passwordEt.getText().toString().trim();


                RequestParams params = new RequestParams();

                params.put("action","login");

                params.put("username",username);

                params.put("passwd",passwd);

                HttpUtil.get("ClientServlet", params, new TextHttpResponseHandler() {

                    @Override

                    public void onFailure(int i, Header[] headers, String s, Throwable throwable) {

                        D.out(throwable);

                        T.showToast(this_,getString(R.string.service_ip_error_str));

                    }


                    @Override

                    public void onSuccess(int i, Header[] headers, String s) {

                        D.out(s);

                        if(isFail(s)){

                            T.showToast(this_,getString(R.string.username_or_pass_error_str));

                        }else{

                            T.showToast(this_,getString(R.string.login_success_str));

                            ManagerComm.loginUser = GsonUtil.getInstance().fromJson(s, User.class);

                            if(autoLoginSw.isChecked()){

                                ManagerConf.saveToLocal("login_user_kaoshi",s);

                            }

                            startActivity(new Intent(this_, MainActivity.class));

                        }


                    }

                });


                break;

            case R.id.forget_pass_tv:

                startActivity(new Intent(this_,FindPasswordActivity.class));

                break;

            case R.id.switch_fun_tv:

                startActivity(new Intent(this_,RegisterActivity.class));

                //leftInOut();

                break;

        }

    }

}


5.1.2注册信息界面

用户打开APP点击“注册”根据要求输入正确的信息即可注册成系统用户。其界面如图5-2所示。


图5-2注册信息界面

注册部分的代码如下所示:

 @OnClick({R.id.left_tv, R.id.right_tv, R.id.birth_et, R.id.register_btn,R.id.pic_add_tv, R.id.pic_add2_tv})

    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.left_tv:

                finish();

                break;

            case R.id.right_tv:

                break;


            case R.id.pic_add_tv:

                Intent intent = new Intent(Intent.ACTION_PICK, null);

                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Constants.IMAGE_UNSPECIFIED);

                startActivityForResult(intent, Constants.ALBUM_REQUEST_CODE);

                break;

            case R.id.pic_add2_tv:

                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.

                        getExternalStorageDirectory(), "temp.jpg")));

                startActivityForResult(intent, Constants.CROP_REQUEST_CODE);

                break;

            case R.id.birth_et:

                break;

            case R.id.register_btn:



                if (photo == null) {

                    T.showToast(this_, getString(R.string.select_phote_require_str));

                    return;

                }


                final String username = usernameEt.getText().toString().trim();

                final String passwd = passwordEt.getText().toString().trim();

                String passwd2 = password2Et.getText().toString().trim();

                final String email = emailEt.getText().toString().trim();

                final String name = nameEt.getText().toString().trim();

                final String tel = telEt.getText().toString().trim();

                final String qq = qqEt.getText().toString().trim();

                final String weChat = weChatEt.getText().toString().trim();

                final String sex = sexSp.getSelectedItem().toString();

                final String birth = birthEt.getText().toString().trim();


                if (TextUtils.isEmpty(username) || TextUtils.isEmpty(passwd) || TextUtils.isEmpty(passwd2)) {

                    T.showToast(this_, getString(R.string.username_passe_is_no_null_str));

                    return;

                }

                if (!passwd.equals(passwd2)) {

                    T.showToast(this_, getString(R.string.pass_diff_str));

                    return;

                }



                File file = new File(Constants.ImageTempPath);

                RequestParams requestParams = new RequestParams();

//                if(!file.exists()){

//                    File file =

//                }

                try {

                    requestParams.put("file", file);

                    HttpUtil.post("UploadServlet", requestParams, new TextHttpResponseHandler() {

 @Override

 public void onFailure(int i, Header[] headers, String s, Throwable throwable) {


                        }


 @Override

 public void onSuccess(int i, Header[] headers, String s) {

              D.out("img:" + s);

              img = s;

              RequestParams params = new RequestParams();

              params.put("action", "register");

              params.put("username", username);

              params.put("passwd", passwd);

              params.put("email", email);

              params.put("name", name);

              params.put("tel", tel);

              params.put("qq", qq);

              params.put("wechat", weChat);

              params.put("sex", sex);

              params.put("birth", birth);

              params.put("img", img);


              HttpUtil.post("ClientServlet", params, new TextHttpResponseHandler() {

              @Override

              public void onFailure(int i, Header[] headers, String s, Throwable throwable) {

              T.showToast(this_, getString(R.string.register_fail_str));

                                }


                 @Override

                public void onSuccess(int i, Header[] headers, String s) {

                                    T.showToast(this_, getString(R.string.register_success_to_login_str));

                 startActivity(new Intent(this_, LoginActivity.class));


                                }

                            });


                        }

                    });

                } catch (FileNotFoundException e) {

                    e.printStackTrace();

                }



                break;

        }

    }

5.1.3系统首页界面

视频进入系统可显示首页信息。其界面如图5-3所示。


图5-3首页信息界面

首页信息主要代码:

protected void initData() {

        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);

        menuRl.setVisibility(View.GONE);



        adapter = new CommonAdapter<Shipin>(this_, crudList, R.layout.item_shipin) {

            @Override

            public void convert(ViewHolder helper, Shipin item) {


                helper.setText(R.id.name_tv, item.getName());

                helper.setText(R.id.msg_tv, "发布用户:" + item.getUsername());

                helper.setText(R.id.msg2_tv, "发布时间:" + item.getDate());


//

//                VideoView videoVv = helper.getView(R.id.video_vv);

//                //String url = getIntent().getStringExtra("url");

//                Uri uri = Uri.parse(HttpUtil.BASE_URL_UPLOAD + item.getImg() );

//                videoVv.setMediaController(new MediaController(this_));

//                videoVv.setVideoURI(uri);

//                videoVv.start();


            }

        };

5.1.4视频播放

点击系统中“视频”即可查看视频信息等。其界面如图5-4所示。


图5-4视频查看界面

主要代码如下所示:

    protected void initData() {

        setContentView(R.layout.activity_video);

        ButterKnife.bind(this);

        String videoPath = getIntent().getStringExtra("path");


        D.out(videoPath);

        //String url = getIntent().getStringExtra("url");

        Uri uri = Uri.parse(videoPath);

        videoVv.setMediaController(new MediaController(this_));

        videoVv.setVideoURI(uri);  

        videoVv.start();

    }

该方法以uri的方式设置视频源,可以是网络的uri也可以是本地uri,算是比较方便。

但是有一点值得注意,这个方法并不是万能的,它在视频的播放格式以及播放效率都存在着较大的不足,日后会对其进行优化。

5.1.5发布弹幕界面

在视频查看页面,输入内容点击“发送”即可发送弹幕信息。其界面如图5-5所示。


图5-5发送弹幕管理界面

弹幕效果实际就是在视频的view上面再覆盖一个显示弹幕的view,并且弹幕是完全透明的,丝毫不影响用户的观影体验。因此,关于此部分的界面则应该是一个用于播放视频的VideoView控件用于播放视频,一个DanmakuView控件用于显示弹幕,一个EditText控件用于输入弹幕文本,一个Button控件用于显示发送弹幕的按钮。至于弹幕的动态显示效果,则是通过Animation方法,使弹幕从左往右飘过:

   public void init(ViewGroup rootView, Danmaku danmaku, int y, int duration) {

        setRootView(rootView);

        setDanmaku(danmaku);

        initAnimation(y, duration);

    }


    public void setRootView(ViewGroup rootView) {

        mRootView = rootView;

    }


    public void setDanmaku(Danmaku danmaku) {

        mDanmaku = danmaku;

        setText(danmaku.getContent());

        setTextColor(danmaku.getColor());

        setShadowLayer(2.5f, 0, 0, Color.BLACK);

        setSingleLine(true);

        setTextSize(TypedValue.COMPLEX_UNIT_PX, (danmaku.getSize() == 0 ? mTextSizeMiddle : mTextSizeSmall));

    }


    public Danmaku getDanmaku() {

        return mDanmaku;

    }


    public void initAnimation(int y, int duration) {

        y = (int) (y * getTextSize());

        mAnim = new TranslateAnimation(Animation.ABSOLUTE, mRootView.getWidth(),

                Animation.ABSOLUTE, -mRootView.getWidth(),

                Animation.ABSOLUTE, y,

                Animation.ABSOLUTE, y);

        mAnim.setDuration(duration);

        mAnim.setFillAfter(false);

        mAnim.setInterpolator(new LinearInterpolator());

        mAnim.setAnimationListener(new Animation.AnimationListener() {

            @Override

            public void onAnimationStart(Animation animation) {

                for (OnEnterListener mOnEnterListener : mOnEnterListeners) {

                    if (mOnEnterListener != null) {

                        mOnEnterListener.onEnter();

                    }

                }

            }

5.1.6个人信息管理界面

   用户可以对个信息进行管理。如图5-6所示。


图5-6个人信息管理界面

5.1.7视频发布管理界面

用户可以点击“发布”进行视频上传和发布。其界面如图5-7所示。


图5-7视频发布管理界面

视频发布管理代码如下:

   @OnClick({R.id.left_tv, R.id.right_tv, R.id.ok_btn, R.id.pic_add_tv, R.id.pic_add2_tv,R.id.bo_btn})

    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.left_tv:

                finish();

                break;

            case R.id.right_tv:

                break;

            case R.id.ok_btn:


                if (TextUtils.isEmpty(videoPath)) {

                    T.showToast(this_, "请选择视频");

                    return;

                }


                final String name = nameEt.getText().toString().trim();

                if (TextUtils.isEmpty(name)) {

                    T.showToast(this_, "请填写完整");

                    return;

                }



                File file = new File(videoPath);

                RequestParams requestParams = new RequestParams();

                try {

                    requestParams.put("file", file);

                    HttpUtil.post("UploadServlet", requestParams, new TextHttpResponseHandler() {

                        @Override

                        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {


                        }


                        @Override

                        public void onSuccess(int statusCode, Header[] headers, String responseString) {

                            RequestParams params = new RequestParams();

                            if (item != null) {

                                params.add("action", "edit");

                                params.put("id", item.getId());

                            } else {

                                params.add("action", "add");

                            }


                            params.put("name", name);

                            params.put("img", responseString);

                            params.put("username", ManagerComm.loginUser.getUsername());


                            HttpUtil.post("ShipinServlet", params, new TextHttpResponseHandler() {

                                @Override

                                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

                                    D.out(throwable);

                                }


                                @Override

                                public void onSuccess(int statusCode, Header[] headers, String responseString) {


                                    if (item != null) {

                                        T.showToast(this_, "修改成功");

                                    } else {

                                        T.showToast(this_, "上传成功");

                                    }

                                    finish();

                                }

                            });

                        }

                    });



                } catch (FileNotFoundException e) {

                    e.printStackTrace();

                }


                break;

            case R.id.pic_add_tv:

                Intent intent = new Intent(Intent.ACTION_PICK, null);

                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "video/*");

                startActivityForResult(intent, Constants.ALBUM_REQUEST_CODE);

                break;

            case R.id.pic_add2_tv:

                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.

                        getExternalStorageDirectory(), "temp.jpg")));

                startActivityForResult(intent, Constants.CROP_REQUEST_CODE);

                break;

            case R.id.bo_btn:

                if(TextUtils.isEmpty(videoPath)){

                    T.showToast(this_,"请选择视频");

                    return;

                }

                startActivity(new Intent(this_,VideoActivity.class).putExtra("path",videoPath));

                break;

        }

    }

5.2管理员功能模块的实现

本作品的服务器使用Java语言开发,页面使用jsp web动态开发技术,通过Severlet请求框架来实现。

Jsp的运行原理:WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

每个JSP页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

客户端通过http post的方式与服务器进行网络通讯,服务器将数据持久化到mysql数据库中。

5.2.1管理员用户管理界面

管理员可以对用户信息添加,修改,删除。其界面如图5-8所示。

            

图5-8用户管理界面

5.2.2视频管理界面

管理员可以对视频信息添加,修改,删除。其界面如图5-9所示。


图5-9视频管理界面

6系统测试

系统测试是软件设计的最后一道工序,也是非常重要的一步。用于检查软件的质量、性能、安全性等是否能够满足视频需求。一套符合要求测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低视频风险系数。通常系统测试包括:功能测试、安全测试、可用性测试、性能测试等方面。

为了使本软件运行更加稳定,我对它进行了全面的测试,其中测试分为二部分,一种是界面测试;另一种功能测试。

首先我们来说界面测试,界面测试是为了使程序在不同的的操作平台上能够运行界面,并且能够保持原来的风格。经测试程序运行正常,运行界面上的字体图片等设置都能够保持得非常好。不出现字体变形等情况!

其次进行功能测试。该系统测试采用的是单元测试,集成测试,完善性测试等多种方式进行测试。

6.1系统测试的意义

测试的定义:程序测试的目的是为了找到错误而实行程序的一个过程。测试(Testing)的任务与目的可以表现为:

目的:发现程序的错误;

任务:通过运行计算机上的程序,找到程序中隐藏的错误。

另一个预测的相关术语叫纠错(Debugging)。其目的以及任务可以规定为:

目的:找到并且纠正错误;

任务:解除软件的故障,从而保证程序的可靠运行。测试与纠错的关系,可以用图6-1的数据流图来说明。从图中可以看出,每一次系统的测试是要准备好若干个测试数据,从而与被测试的程序一起送入计算机进行命令执行。一般我们把程序执行一次所需要的测试数据,叫做一个“测试用例(Test Case)。其中每一个测试用所例产生相应的“测试结果”。但是如果它的测试结果与“期望结果”不一致的话,那就是说明程序中的错误是存在的,需要我们来找到并改正。


测试

  系统

测试数据

测试结果

错误信息

改正信息

期望结果









图6-1测试与纠错信息流程

6.2性能测试

性能测试主要通过在模拟的系统环境中进行运行,看可否满足客户的要求。性能测试有三个指标,分别包括系统运行的速度、网络响应时间和支持并发节点数。

1、系统运行速度:在不同配置的电脑运行本系统,迟钝现象没有出现。

2、网络响应时间:网络响应时间即系统运行过程中所使用的时间多少,它有三个参数,分别为网络最小相应时间,平均响应时间以及最大响应时间。经过测试,在网络通畅的状态下,网络响应时间三个参数分别为:2/3/6s,符合客户正常需求,属于视频心理可承受范围。

3、支持并发节点数:经过模拟环境测试,本系统在并发节点达55个时,网络运营速度会发生较大波动,延迟时间10秒左右,符合客户需求。

6.3测试分析

本基于android的弹幕视频播放软件在设计时借鉴了国内外优秀网站的优点,从界面到系统设计都保证了管理员以及视频能够方便操作。系统的主要特点和优缺点归纳如下:

(1)本软件能够播放视频,但是不支持所有格式的视频,对于一些视频还是不支持。

(2)该基于android的弹幕视频播放软件内容全面,管理方便可以及时的全面的处理各种错误,异常,这样避免了很多因客户的马虎操作而出现的失误,其操作方便,视频界面友好,能够上网的人都可以很好的进行操作。

经过对总体测试分析,基于android的弹幕视频播放软件的设计与实现满足用户的要求和需求。

7结论

本系统通过对Android和MYSQL数据库的简介,从硬件和软件两反面说明了基于android的弹幕视频播放软件的可行性,本文结论及研究成果如下:实现了Android与MYSQL相结合构建的基于android的弹幕视频播放软件,通过本次基于android的弹幕视频播放软件的研究与实现,我感触到学习一门新技术,最重要的是实践,只有多动手才能尽快掌握它,一个系统的开发,经验是最重要的,经验不足,就难免会有许多考虑不周之处。要想吸引更多的视频,系统的界面必须要美观、有特色、友好,功能要健全。

由于在此之前对于Android知识没有深入了解,所以从一开始就碰到许多困难,例如一开始的页面显示不规范、数据库连接有问题已经无法实现参数的传递等等,不过通过在网上寻找有关资料以及同学的帮助下最后都得到了解决,在此过程中,我不仅学到了很多知识,也提高了自己解决问题的能力,尤其是学会如何从大量的信息中筛选出所需有用的信息,同时我更加深刻的体会到了,虽然书本上的大部分知识都是有价值,正确的,但实际上每个人编程的思路和对数据处理的方法、思想都是不同的,这就要求我们一定要通过实践才能找到解决问题的方案。在此次毕业设计活动中,我不断的提高了自己,也得到了宝贵的经验,我相信这些对我以后的发展都会有很大帮助。

通过这次基于android的弹幕视频播放软件的开发,我参考了很多相关系统的例子,取长补短,吸取了其他系统的长处,逐步对该系统进行了完善,但是该系统还是有很多的不足之处,有待以后进一步学习。

实践证明,基于android的弹幕视频播放软件有着非常好的发展前景,经过测试运行。本系统界面友好、使用灵活、操作简单、功能齐全、表现方式独特,已基本具备了成熟的技术理论。



 


致   谢

四年的学习生活在这个季节将结束,但是在我的生命这仅仅只是一个逗号,我将面对的旅程的另一个的开始。通过这次毕业设计的整个开发过程,从需求分析到具体功能实现,再到最终测试和维护的理解有了很大的进步,让我对系统开发有了更深刻的认识,极大的提高了我的动手能力和独立解决问题的能力,这是这次毕业设计最大的收获。

首先想在论文写作中要感谢我的指导老师给了我很大的帮助,他对我论文的严格要求,使我获得了很大的收获。以及深厚的理论知识,实践经验,严谨的治学态度和扎实的研究方法的影响和激励着我。在这方面,我谨表示衷心的感谢。

其次,我要感谢专业课的所有老师们,是他们在我的专业课的学习过程中无私的教授给我许多专业知识和技能,使我能够在论文写作的过程中顺利解决难题和疑问。同时还要感谢所有给予我关心和帮助的同学和朋友们,她们在生活和学习中给了我大量的帮助,对她们的关怀和帮助致以崇高的敬意。在今后的人生道路上,我一定谨遵恩师的教诲,发挥自己的潜能。

最后,对阅读和评审本论文的各位老师表示衷心的感谢!



参考文献

略……