目录
1.概述 1
1.1选题背景 1
1.2目的意义 1
1.3人员分工 1
2.需求分析 2
2.1功能性需求 2
2.2数据性需求 2
2.3技术可行性 2
2.4业务流程 2
2.5业务逻辑 3
3.总体设计 4
3.1系统架构设计 4
3.2功能结构设计 4
3.3数据结构设计 5
4.详细设计与实现 5
4.1主页面设计 5
4.2一对一辅导 6
4.3课堂讨论 7
4.4课堂直播 8
5.总结 9
参考文献 9
2.需求分析
2.1功能性需求
(1)登录注册功能;
(2)一对一视频对讲功能;
(3)在线直播教学功能;
(4)打开关闭麦克风或摄像头功能;
(5)课堂多人语音聊天讨论功能;
(6)文字聊天功能;
(7)画板功能;
2.2数据性需求
(1)用户基本信息,包括用户会话 ID,用户名称与密码等;
(2)用户发送一对一视频请求时,需要传输对应的操作字符串,发起请求用户的
fromID,被呼叫方 toID,语音视频流的发送与接收,同时显示本次通话时间;
(3)当用户发起直播,需要传输对应操作的字符串,申请直播的用户 ID 以及创建的直播间名称,本文转载自http://www.biyezuopin.vip/onews.asp?id=15015返回在线人数等实时数据与人数上限。
2.3技术可行性
目前存在 webRTC、rtmp、腾讯 TRTC 等音视频互动解决方案,可以调用相关 API 或 SDK 进行开发,以实现以上功能性需求。

2.4业务流程

我们主要通过以下步骤,来实现视频对讲业务的完成:
(1)音频和视频采集:通过硬件设备对视频和音频进行采集,主要是利用摄像头和收 音装置进行数据的采集,并将其转化为电信号。
(2)视频预处理:对视频帧进行美化,使视频呈现多种效果。
(3)视频的编码和封装:为了降低视频数据量,把视频的像素数据压缩成视频码流,

以防止视频过大。进行封装则有效减少了加载的延迟。
(4)推流:采集好的音视频数据,通过流媒体协议来发送到流媒体服务器。
(5)服务器处理数据:数据分发,将网站的内容发送到用户网路的边缘,方便用户获 得内容。同时还有回源,录制,实时转码等操作。
(6)拉流:通过传输协议,从流媒体服务器获取视频数据。
(7)视频解码:从视频,音频的混合流中分离出视频和音频,并进行解码。
(8)视频播放:将音视频通过显示器和音响播放出来。
2.5业务逻辑
点击进入 app,选择进行身份验证,验证通过后,进入主页面,选择相应需要的服务,通过调用 starRTC 的 SDK 接口与云服务器的流媒体服务通信,进而实现相应的功能。

package com.starrtc.demo.demo;import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;import com.starrtc.demo.R;
import com.starrtc.demo.demo.Activity.LoginOrRegisterActivity;
import com.starrtc.demo.demo.service.KeepLiveService;
import com.starrtc.demo.utils.AEvent;import java.util.ArrayList;
import java.util.List;public class SplashActivity extends Activity {private boolean isLogin = false;private final boolean checkNetState = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);setContentView(R.layout.activity_splash);AEvent.setHandler(new Handler());checkPermission();}private int times = 0;private final int REQUEST_PHONE_PERMISSIONS = 0;private void checkPermission(){times++;final List<String> permissionsList = new ArrayList<>();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){if ((checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.ACCESS_NETWORK_STATE);if ((checkSelfPermission(Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.READ_PHONE_STATE);if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);if ((checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE);if ((checkSelfPermission(Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.CAMERA);if ((checkSelfPermission(Manifest.permission.BLUETOOTH)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.BLUETOOTH);if ((checkSelfPermission(Manifest.permission.RECORD_AUDIO)!= PackageManager.PERMISSION_GRANTED)) permissionsList.add(Manifest.permission.RECORD_AUDIO);if (permissionsList.size() != 0){if(times==1){requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),REQUEST_PHONE_PERMISSIONS);}else{new AlertDialog.Builder(this).setCancelable(true).setTitle("提示").setMessage("获取不到授权,APP将无法正常使用,请允许APP获取权限!").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),REQUEST_PHONE_PERMISSIONS);}}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {finish();}}).show();}}else{initSDK();}}else{initSDK();}}@Overridepublic void onRequestPermissionsResult(int requestCode,  final String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);checkPermission();}private void initSDK(){startService();startAnimation();}private void startService(){Intent intent = new Intent(SplashActivity.this, KeepLiveService.class);startService(intent);}@SuppressLint("WrongConstant")private void startAnimation(){isLogin = true;final View eye = findViewById(R.id.eye);eye.setAlpha(0.2f);final View black = findViewById(R.id.black_view);final View white = findViewById(R.id.white_view);final ObjectAnimator va = ObjectAnimator.ofFloat(eye,"alpha",0.2f,1f);va.setDuration(1000);va.setRepeatCount(ValueAnimator.INFINITE);va.setRepeatMode(Animation.REVERSE);va.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {if(isLogin){va.cancel();ObjectAnimator va1 = ObjectAnimator.ofFloat(white,"alpha",0f,1f);ObjectAnimator va2 = ObjectAnimator.ofFloat(black,"alpha",1f,0f);AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(1500);animatorSet.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {new Handler(){@Overridepublic void handleMessage(Message msg){startActivity(new Intent(SplashActivity.this, LoginOrRegisterActivity.class));finish();}}.sendEmptyMessageDelayed(0,500);}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});animatorSet.playTogether(va1,va2);animatorSet.start();}}});va.start();}
}
















基于安卓和springboot的在线课堂设计相关推荐

  1. java 美发管理系统_基于安卓Android潮流美发系统APP设计(MySQL)

    基于安卓Android潮流美发系统APP设计(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文16000字,程序代码,MySQL数据库) 本应用主要用于对手机上网用户,在线预约 ...

  2. 【计算机毕业设计】在线课堂设计与实现

    一.系统截图(需要演示视频可以私聊) 摘  要 随着移动应用技术的发展,越来越多的用户借助于移动手机.电脑完成生活中的事务,许多的行业也更加重视与互联网的结合,针对传统在线课堂设计与实现问题,结合用户 ...

  3. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计(附源码)

    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计 目录 一.项目简介 二.系统核心功能模块部分截图 2.1用户登陆的设计与实现 2.2 ...

  4. 毕设分享springBoot+vue 在线课堂学习系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2.1 界面展示 3 设计方案 3.1 概述 3.2 系统流程 3.3 系统结构设计 4 项目获取 1 项目简介 Hi,各位同学好呀,这里是M学姐! 今天向大家分 ...

  5. java创建医生的对象_基于安卓Android的作物医生App设计开发(MySQL)(含录像)

    基于安卓Android的作物医生App设计开发(MySQL)(含录像)(毕业论文14000字,PHP程序代码,MySQL数据库) 本系统使用软件工程方法进行一系列的分析.设计.实现与测试.使用面向对象 ...

  6. Android记账系统可行性分析,毕业设计论文-基于安卓的大学生记账管理系统的设计与实现.doc...

    毕业设计论文-基于安卓的大学生记账管理系统的设计与实现 毕 业 设 计 中文题目基于安卓的大学生记账管理系统的设计与Design and Implementation of theCollege St ...

  7. android网上书城设计报告,基于安卓的网上商城手机APP设计与实现

    摘要: 近几年来,随着互联网和多媒体运营的持续和有效的迅猛发展,大多数人都开始选择在网上进行足不出户就可以品尝天下鲜的生活,Internet这个英语名词在人们的生活中变成了熟悉和时尚的冥思.人们的生活 ...

  8. android校园淘论文,基于安卓的校园寻物app的设计与实现--大学生毕业论文(设计).doc...

    基于安卓的校园寻物app的设计与实现--大学生毕业论文(设计) 文 献 信 息 检 索 论 文 课题名称:基于安卓的校园管理软件的设计与实现 负 责 人: 班 级: 学 号: 完成时间: 2014年1 ...

  9. 微博app是用java写的吗_基于安卓Android第三方微博APP的设计(Eclipse)

    基于安卓Android第三方微博APP的设计(Eclipse)(论文11000字,程序代码) 摘要:Android系统是基于LINUX的手机操作系统,其最大的优势在于整个系统的开源性和免费性.本系统以 ...

最新文章

  1. bzoj 1787 紧急集合
  2. 单网卡Squid AS4 U5 设置
  3. python统计单词出现次数_用python统计单词出现频率
  4. orm java_Java 8 Friday:不再需要ORM
  5. 网站收录工具(php导航自动收录源码)_10步把企业网站优化做到极致,SEO优化的核心知识...
  6. Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
  7. model 提交表信息java,Angular6+antd+java+SpringMVC,表单提交自动接收模型对象?
  8. 正则至少一个数字_JavaScript学习笔记(十七)-- 正则
  9. hive中一个好用的函数reflect
  10. 人工智能(AI)真正的价值究竟何在?
  11. Servlet期末复习笔记
  12. Usage of #pragma
  13. Shell脚本学习指南 下载
  14. 立创eda学习笔记二十五:绘制原理图的电气网络(绘制导线,使用节点)
  15. bp神经网络模型的优缺点,bp神经网络缺点及克服
  16. spss统计分析基础教程(下)--自学
  17. 普通学校,非科班,从电脑小白到大厂offer的自学之路
  18. 暂时解决Xmarks无法同步
  19. 面向对象与面向过程的区别与联系
  20. S3C6410 SD Card一键烧写 WINCE 6.0

热门文章

  1. 如何高效地利用四象限原则管理时间?
  2. 第二节 下载和安装ISM Web组态软件
  3. “开放共享与价值回归”2022开放原子全球开源峰会区块链分论坛成功举办
  4. oracle 10G 升级到11G
  5. Android安卓开发高级应用-软件更新(联网-全更新增量更新)
  6. 好物神单 APP版 - 京东秒杀助手 秒杀精灵 秒杀神器
  7. markdown写作方法规范参考汇总
  8. 阿里云redis大key搜索工具
  9. android java websocket client_websocket服务端,android客户端示例
  10. Python实现让视频自动打码,再也不怕出现少儿不宜的画面了