当前位置: 首页 > 编程日记 > 正文

运用面向对象原则,设计一款音乐点唱机

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

.设计内容及要求

能够实现简单的音乐播放器功能,如:打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录

一个简单的基于java语言的音乐播放器,菜单栏:文件,播放控制和播放列表,文件菜单包含打开、循环和退出三个菜单项;播放控制菜单包含播放、暂停和停止三个菜单项,播放列表菜单则是当向里面添加歌曲之后才能够查看到里面所包含的歌曲目录。当播放歌曲时,可以调节音量大小或者设置是否静音;可以查看当前播放音乐的相关属性,如:歌曲名,歌手,发布时间,所属专辑等等。

2.需求分析

1、时间跟踪条:根据歌曲播放的进度,控制条自动进行追踪,用户可以随时了解歌曲的播放进度

2、音量控制键:可以点击该控键进行音量大小的调节以及是否静音的设置

3、属性查询键:通过该控键,用户可以查看当前播放音乐的相属性,获取关于该歌曲的用户所需的相关信息。

4、菜单栏:

①文件:

打开:用户通过该菜单项打开本地音乐文件,听任何用户想听的歌曲

循环:通过循环设置,用户可以重复的播放一首喜欢的歌曲

退出:退出音乐播放器,及退出该程序

②播放控制:

播放:

选择歌曲之后,通过点击播放菜单项启动播放器播

放音乐

暂停:暂停当前正在播放的音乐

停止:停止当前正在播放的音乐

③播放列表:当用户通过文件打开本地音乐文件后,及相当于在

播放列表里面添加了歌曲,及形成相应的歌曲播放目录

3

.总体设计

结合需求分析来看,

整个设计包含了简单的菜单栏,根据用户需求设置了三个简单的实现基本操作的菜单,分别是:文件,播放控制,播放列表;根据具体的操作每个菜单还包含了相应的菜单项,文件:打开,循环,退出;播放控制:播放,暂停,停止;播放列表则没有菜单项,该菜单就是用来显示或者查看相应的歌曲目录的。该音乐播放器设置了两个窗口,运行程序时打开的初始化欢迎界面,用户可以根据自己的需求进行菜单栏里面的基本操作和相应的设置,当用户添加或者打开音乐播放文件的时候,程序将会显示出第二个音乐文件播放窗口,与此同时,第一个初始化窗口将会自动隐藏,在音乐播放窗口里面用户可以进行相关的音乐播放的控制操作。当用户进入音乐播放窗口时,该窗口有几个快捷控制的控键:时间追踪轴:可以实现播放的前进、后退功能,根据用户需求调节音乐的播放进度等;音量控制:设置静音,打开扬声器或者调节音量大小;播放列表:查看当前播放音乐的相关属性。

(一)

JMF(java媒体框架)简介

JMF 即Java媒体框架。其核心框架支持不同媒体,如音频输出和视频输出,包括时间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。JMF实际上是Java的一个类包。它包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。JMF软件是Java Media系列软件的一部分。采用各种Java Media API,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端,Java小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。就是说,各种Java Media API发挥了Java平台的固有优势,将"编写一次,到处运行"的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发成本。在开发JMF 应用程序之前要完全理解

JMF 的体系架构、接口和类。就拿我们的家用摄像机系统作个例子。首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。JMF API 提供的也是同样的模型。JMF 提供的模型可大致分为七类*

数据源(

Data source

*

截取设备(

Capture Device

,包括视频和音频截取设备)

*

播放器(

Player

*

处理器(

Processor

*

数据池(

DataSink

*

数据格式(

Format

*

管理器(

Manager

如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器

Player

即可。如果想把捕获的数据发送到网络或者保存起来,就需要创建

处理器

Processor

基本步骤是首先获取视频、音频捕获设备的信息,然后再根据取得的

设备信息确定设备的位置。

找到设备的位置以后

,

调用

ManageCreatePlayer

方法创建

Player

,当

Player

开始播放的时候,就开始了捕获的过程。

有多种方法获得捕获设备信息,可以通过查询指定的格式,也可以查

询特定的设备名字。

Player

准备好播放数据,当

Player

发出这个事件时,

就可以获取播放器的可视面板和控制面板了。具体步骤如下:

1.

先把所有的捕获设备调出来

2.

创建

Player,

Play

开始的时候,就开始了音频捕获的过程

3.

MediaLocator

为参数,创建

Player

4.

PLAYER

添加监听器,以便监听

RealizeComplete

事件

(二)代码实现

1

)添加库、包等相关文件

import javax.media.ControllerEvent;

import javax.media.ControllerListener;

import javax.media.EndOfMediaEvent;

import javax.media.PrefetchCompleteEvent;

import javax.media.RealizeCompleteEvent;

import javax.media.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

2

)初始化窗口

①界面

②代码实现

public void setupMenu() {

Menu f = new Menu("

文件

");

MenuItem mi = new MenuItem("

打开

");

CheckboxMenuItem cbmi = new CheckboxMenuItem("

循环

", false);

MenuItem ee = new MenuItem("

退出

");

f.add(mi);

f.add(cbmi);

f.add(ee);

mi.addActionListener(this);

cbmi.addActionListener(this);

ee.addActionListener(this);

f.addSeparator();

f.addSeparator();

f.addSeparator();

Menu l = new Menu("

播放列表

");

Menu c = new Menu("

播放控制

");

MenuItem move = new MenuItem("

播放

");

MenuItem pause = new MenuItem("

暂停

");

MenuItem stop = new MenuItem("

停止

");

move.addActionListener(this);

pause.addActionListener(this);

stop.addActionListener(this);

c.add(move);

c.add(pause);

c.add(stop);

c.addSeparator();

c.addSeparator();

c.addSeparator();

MenuBar mb = new MenuBar();

mb.add(f);

mb.add(c);

mb.add(l);

setMenuBar(mb);

}

3

)音乐播放窗口机基本功能的实现

public void actionPerformed(ActionEvent e)

{

String cufile, selectfile, currentDirectory;

if (e.getActionCommand().equals("

退出

"))

{

dispose();

return;

}

if (e.getActionCommand().equals("

播放

"))

{

if (player != null)

player.start();

return;

}

if (e.getActionCommand().equals("

暂停

"))

{

if (player != null)

player.stop();

return;

}

if (e.getActionCommand().equals("

停止

"))

{

if (player != null)

{

player.stop();

player.setMediaTime(new Time(0));

}

return;

}

if (e.getActionCommand().equals("

打开

"))

{

FileDialog fd = new FileDialog(this, "

打开媒体文件

", FileDialog.LOAD);

fd.setVisible(true);

if (fd.getFile() == null)

return;

selectfile = fd.getFile();

currentDirectory = fd.getDirectory();

cufile = currentDirectory + selectfile;

MenuItem mi = new MenuItem(selectfile);

mi.setActionCommand(cufile);

MenuBar mb = getMenuBar();

Menu m = mb.getMenu(2);

mi.addActionListener(this);

m.add(mi);

} else {

cufile = e.getActionCommand();

selectfile = cufile;

}

if (player != null)

player.close();

try {

player = Manager.createPlayer(new MediaLocator("file:" + cufile));

}catch (Exception e2)

{

System.out.println(e2);

return;

}

if (player == null)

{

System.out.println("

无法创建播放器

");

return;

}

first = false;

setTitle(selectfile);

player.addControllerListener(this);

player.prefetch();

}

public void itemStateChanged(ItemEvent arg0)

{

}

public static void main(String[] args)

{

new MediaPlayer("

播放器

");

}

public void controllerUpdate(ControllerEvent e)

{

Container tainer = getContentPane();

if (e instanceof ControllerClosedEvent)

{

if (vc != null)

{

remove(vc);

vc = null;

}

if (cc != null)

{

remove(cc);

cc = null;

}

}

if (e instanceof EndOfMediaEvent)

{

player.setMediaTime(new Time(0));

if (loop)

player.start();

return;

}

if (e instanceof PrefetchCompleteEvent)

{

player.start();

return;

}

if (e instanceof RealizeCompleteEvent)

{

vc = player.getVisualComponent();

if (vc != null)

tainer.add(vc, BorderLayout.CENTER);

cc = player.getControlPanelComponent();cc.setBackground(Color.blue);

if (cc != null)

{

tainer.add(cc, BorderLayout.SOUTH);

if (vc != null)

{

pack();

return;

}

Else

{

setSize(300, 75);

setVisible(true);

return;

}

}

}

}

转载于:https://my.oschina.net/u/2822116/blog/791305

相关文章:

多传感器融合之滤波(三)--------

多传感器融合之滤波(三):IMU,GPS,Lidar,Ladar数据处理

【Codeforces】835B The number on the board (贪心)

把所有字符串上的数字加起来&#xff0c;看是否超过k&#xff0c;没有超过k的话&#xff0c;把字符串sort&#xff0c;从第一位开始&#xff0c;将字符变成9&#xff0c;直到sum大于等于k为止。 #include <iostream> #include <cstring> #include <string> …

拯救尴尬:鉴黄神器NSFW JS开源了!

近日&#xff0c;GitHub上开源了一款鉴定不雅内容的js库NSFW JS&#xff0c;你可以使用NSFW JS识别不雅内容&#xff0c;所有操作都只在客户端进行&#xff0c;甚至都不需要让文件离开用户的电脑。 演示地址&#xff1a;https://nsfwjs.com/ 项目地址&#xff1a;https://githu…

Linux下用于查看系统当前登录用户信息的4种方法

作为系统管理员&#xff0c;你可能经常会&#xff08;在某个时候&#xff09;需要查看系统中有哪些用户正在活动。有些时候&#xff0c;你甚至需要知道他&#xff08;她&#xff09;们正在做什么。本文为我们总结了4种查看系统用户信息&#xff08;通过编号&#xff08;ID&…

三维重建【一】——————(深度学习方式)

经典的计算机视觉问题是3-D重建。 基本上可以分成两种路径&#xff1a;一是多视角重建&#xff0c;二是运动重建。前者有一个经典的方法是多视角立体视觉&#xff08;MVS&#xff0c;multiple view stereo&#xff09;&#xff0c;就是多帧的立体匹配&#xff0c;这样采用CNN模…

【Codeforces】501B Misha and Changing Handles(map)

http://codeforces.com/problemset/problem/501/B map的应用&#xff0c;让新的名字作为key值&#xff0c;旧的名字作为value值&#xff0c;然后一一对应。如果这个旧名字不在map里&#xff0c;则添加进去&#xff1b;如果这个旧名字在map里&#xff0c;则需要进行替换&#x…

vue-cli3+typescript初体验

前言 气势汹涌&#xff0c;ts似乎已经在来的路上&#xff0c;随时可能敲门。2015年&#xff0c;三大前端框架开始火爆的时候&#xff0c;我还在抱着Backbone不放&#xff0c;一直觉得可以轻易转到其他框架去。后来换工作&#xff0c;现实把脸都打肿了&#xff0c;没做过vue、re…

三维重建【二】————3D reconstruction 较为实用的算法资料整理(传统方式)

本文结合一些pape并且将资源进行整合&#xff0c;以便于后期的学习。博客将这些资源一下&#xff0c;这里不得提到大名鼎鼎的KinectFusion以及他后面的一系列工作。KinectFusion单篇论文引用都已经超过3000次了&#xff0c;可以称得上是具有划时代意义的一篇巨著&#xff0c;如…

【Codeforces 738D】Sea Battle(贪心)

http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1  n grid. In this game a ships are placed on the grid. Each of the ships consists of bconsecutive cells. No cell can be part of two ships, however, the ships ca…

【POJ】3617 Best Cow Line (字典序 字符串)

http://poj.org/problem?id3617 给定长度为N(1≤N≤2000)的字符串S&#xff0c;要构造一个长度为N的字符串T。期初&#xff0c;T是一个空串&#xff0c;随后反复进行下列任意操作。 从S的头部删除一个字符&#xff0c;加到T的尾部 从S的尾部删除一个字符&#xff0c;加到T的…

python数据池连接PG

发现网上都是mysql&#xff0c;后面发现PG跟mysql差不多&#xff0c;记录下来&#xff0c;怕忘了 import psycopg2 from DBUtils.PooledDB import PooledDB import psycopg2.extraspool PooledDB(psycopg2, 10,database"boatdb", user"postgres",password…

ASP.NET WebAPi之断点续传下载(下)

前言 上一篇我们穿插了C#的内容&#xff0c;本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传&#xff0c;至此关于webapi断点续传下载以及上传内容都已经全部完结&#xff0c;一直嚷嚷着把SQL Server和Oracle数据库再重新过一遍&#xff0c;这篇…

Git学习记录(一)

git-book 全面资料 git 用树形查看 &#xff08;git 命令代替gitk查看节点树part two 日常使用只要记住下图6个命令即可&#xff0c;但是学海无涯啊 ​ 常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Reposito…

【牛客】CSL 的字符串 (stack map)

https://ac.nowcoder.com/acm/contest/551/D 这个题怎么说&#xff0c;data用来存储这个字母在字符串中最后一次出现的位置&#xff0c;vis则用来记录该字母是否在栈中。 当栈为空的时候&#xff0c;直接将s[i]放入栈中 如果不为空则需要比较栈顶元素和当前s[i]的那个元素&a…

Python:UTF-8编码转换成GBK编码

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding:utf-8 -*- #UTF-8转换成GBK编码 #temp #decode #encode #原理就是把UTF-8转换成万国码&#xff0c;再给万国码进行编码转换成GBK&#xff0c;在python 2.x里面这么用 ""&q…

三维重建【三】-------------------(三维重建资料收集)

Major学者的个人主页汇总&#xff1a; 1.陈宝权&#xff1a;http://web.siat.ac.cn/~baoquan/ 2.南亮亮&#xff1a;http://web.siat.ac.cn/~liangliang/ 3.mueller&#xff1a;http://people.ee.ethz.ch/~pascmu/publications.html 4.Yasutaka Furukawa:http://homes.cs.washi…

在 Linux 中查看时区

1.date date "%Z %z"或者 date -R2.timedatectl timedatectl|grep "Timezone"可以使用 timedatectl 来设置 Linux 时区 3.显示文件 /etc/timezone 的内容 cat /etc/timezone

【HDU】1237 简单计算器 (stack)

http://acm.hdu.edu.cn/showproblem.php?pid1237 题目很好理解&#xff0c;一开始想用优先队列&#xff0c;但好像有点难实现&#xff0c;用stack比较好实现&#xff0c;遇到“ * ” 或者" / " 就进行操作&#xff0c;遇到“ - ” 就把它的相反数加进stack&#xf…

关于 synchronizeOnSession

本文为[原创]文章&#xff0c;转载请标明出处。原文链接&#xff1a;https://weyunx.com/2019/01/22...原文出自微云的技术博客 最近在维护一个老项目&#xff0c;发现了一个问题。我们新增了一个耗时较久的复杂查询的功能&#xff0c;页面采用了 ajax 异步请求数据&#xff0c…

用python操作mysql数据库(之“更新”操作)

#!/usr/bin/env python # -*- coding: utf-8 -*-import MySQLdb#建立连接 conn MySQLdb.connect(host127.0.0.1,userroot,passwd1qaz#EDC,dbtest_db) cur conn.cursor()#对数据进行操作 sql "update user set name%s where id7" #定义sql语句&#xff0c;用于修改…

OpenCV【零】—————cv::Mat——Mat对象创建方法

OpenCV (一)——Mat对象创建方法 目录 OpenCV (一)——Mat对象创建方法 1. cv::Mat优点及原理&#xff08;本质类&#xff09; 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效访问 4. 存储方法 5. 显式创建Mat对象 6. 与其他语言对比的方式 7. Mat操作实例 1. c…

在Vmware中安装Ubuntu

转载自&#xff1a;https://blog.csdn.net/stpeace/article/details/78598333 不是每一个程序员都必须玩过linux&#xff0c;只是博主觉得现在的很多服务器都是linux系统的&#xff0c;而自己属于那种前端也搞&#xff0c;后台也搞&#xff0c;对框架搭建也感兴趣&#xff0c;…

C++回声服务器_5-多进程版本

服务器和客户端都是用多进程来接收和发送数据。 服务器代码 #include <cstdio> #include <cstdlib> #include <cstring> #include <unistd.h> #include <csignal> #include <sys/wait.h> #include <arpa/inet.h> #include <sys/s…

OpenCV 【一】—— OpenCV中数组指针、图像分块计算、指针取像素值与MatToEigen方法,内存对齐

{ Topic1: 高效开辟内存&#xff0c;使适用于大型数组。//开辟新数组&#xff0c;或者开辟新的0或者某一数值的数组/Mat或者Map直接使用memset //大数组操作效率较高 举例1&#xff1a;cv::Mat cv_ncc_temp(cv_input_32f.rows, cv_input_32f.cols, CV_8UC1);memset(cv_ncc_temp…

【Java】类与对象 - 参数传值

目录 面向过程语言简介 面向对象语言简介 面向对象编程的三个特性 参数传值 传值机制 基本数据类型的参数的传值 引用类型参数的传值 可变参数 面向过程语言简介 核心是编写解决问题某个问题的代码块&#xff0c;代码块是程序执行时产生的一种行为。面向过程语言缺少一…

新闻发布项目——业务逻辑层(newsTbService)

package bdqn.newsManageServlet.Service;import java.util.List;import bdqn.newsManageServlet.entity.newsTb;/*** 新闻业务逻辑层的接口* author Administrator**/ public interface newsTbService {//分页查询public List<newsTb>getPagingNews(int pagesize,int pa…

使用阿里云发布分布式网站,开发时候应该注意什么?

虽然之前写过关于负载均衡的文章&#xff0c;但是似乎大家都对负载均衡这个标题很陌生。今天就换个角度&#xff0c;从分布式网站发布角度说一下 首先&#xff0c;网站发布一定离不开服务器&#xff0c;就是阿里云的云服务器ECS。最近发现&#xff0c;老用户也有机会购买特价服…

【Java】类与对象 - 对象的组合

一个类的成员变量可以是Java允许的任何数据类型&#xff0c;因此&#xff0c;一个类可以把某个对象作为自己的成员变量&#xff0c;也就是说&#xff0c;该对象将其他对象作为自己的组成部分。 组合和复用 如果一个对象a组合了对象b&#xff0c;那么对象a就可以委托对象b调用…

CMakeLists.txt学习记录

一、Cmake 学习地址与作用 cmake详细见&#xff1a;https://gitlab.kitware.com/cmake/community/-/wikis/home 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 二、常用命令 …

20145223《信息安全系统设计》 实验四 驱动程序设计

20145223杨梦云《信息安全系统设计》实验四实验报告 一、配置开发环境&#xff08;同实验一&#xff09; 二、阅读和理解源代码 进入/arm2410cl/exp/drivers/01_demo&#xff0c;使用vi编辑器或其他编辑器阅读理解源代码。 三、编译驱动模块及测试程序 上面介绍了在 Makefile 中…