一、服务器端:

最近没有系统学习的计划,看了开源的YOYOPlayer(一个相当强大的播放器软件,基于java编写),心里痒痒,比较肤浅的学习下javasound。
javasound是比较小巧的底层api,引用网上的一幅 javasound体系结构图:

javasound实现: 目前使用最多的是 jdk中javax.sound组件 (包括javax.sound.sampled 和 javax.sound.midi包) 和 开源的 Tritonus(http://www.tritonus.org/)组件
SPI:是Service Provider Interface(服务提供接口),它的作用是以插件的形式提供音频扩展模块。比如,javax.sound组件中,只支持au,mid,wav等少许音频格式,其中不包括mp3。要想支持mp3格式,那么就需要相应的解码器和SPI。所幸的是,已经有相应的开源包。
javazoom(http://www.javazoom.net)下的jlayer,是mp3格式的解码包。
javazoom下的mp3spi就是spi。
只要添加了相应的开源组建包,可以在不修改任何一行代码的情况下,支持其他音频格式。这就是spi的魅力。

简单介绍了javasound的体系结构,下面就介绍一个简易的mp3播放器的实现(所谓简易,就是没有界面,除了能播放mp3等文件外,就啥都不能干了 :) )

几个步骤:
1)得到音频流:

AudioSystem.getAudioInputStream(input)

2)得到音频格式:

audioInputStream.getFormat()

3)初始化数据行信息
数据行信息包括(受数据行支持的音频格式;其内部缓冲区的最小和最大大小 )

DataLine.Info info = new DataLine.Info(SourceDataLine.class, decodedFormat);

4)从混频器获得源数据行
SourceDataLine 接口提供将音频数据写入数据行的缓冲区中的方法。播放或混合音频的应用程序应该以足够快的速度将数据写入源数据行,以防缓冲区下溢(排空),下溢可能导致单击时音频数据中出现可感知的间断

SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);

5)将音频数据写入源数据行中

line.start();
int readLenth = 0;
while (readLenth != -1) {
    readLenth = decodedAudioStream.read(AUDIO_BUFER, 0, AUDIO_BUFER.length);
    if (readLenth != -1) {
        line.write(AUDIO_BUFER, 0, readLenth);
    }
}
line.drain();
line.stop();
line.close();

下面提供完整的简易mp3播放器代码:
其中AudioPlayer仅仅是一个接口。

/**
 * <pre>
 * MP3播放器实现
 * 线程不安全,没有必要多个线程去启动播放器
 * </pre>
 * 
 * @author Lee Jones
 */
public class Mp3Player implements AudioPlayer {

private static final Log    log         = LogFactory.getLog(Mp3Player.class);

private static final byte[] AUDIO_BUFER = new byte[4096];

private AudioInputStream    audioStream;

private AudioFormat         decodedFormat;
    private AudioInputStream    decodedAudioStream;

@Override
    public void play(InputStream input) {
        if (input == null) {
            log.warn("input stream is null");
            return;
        }
        try {
            init(input);
            play();
        } catch (Exception e) {
            log.error("play error:", e);
        }
    }

@Override
    public void play(File file) {
        if (file == null) {
            log.warn("audio file is null");
            return;
        }
        try {
            play(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            log.error("file to inputStream error:", e);
        }
    }

@Override
    public void play(URL url) {
        if (url == null) {
            log.warn("url is null");
            return;
        }
        try {
            play(url.openStream());
        } catch (IOException e) {
            log.error("url open inputStream error:", e);
        }
    }

/**
     * init
     * 
     * @param input
     * @throws UnsupportedAudioFileException
     * @throws IOException
     */
    protected void init(InputStream input) throws UnsupportedAudioFileException, IOException {
        initAudioStream(input);
        initDecodedFormat();
        initDecodedAudioStream();
    }

/**
     * init audio input stream
     * 
     * @param input:audio input stream
     * @throws IOException
     * @throws UnsupportedAudioFileException
     */
    protected void initAudioStream(InputStream input) throws UnsupportedAudioFileException, IOException {
        audioStream = AudioSystem.getAudioInputStream(input);
    }

/**
     * init decoded format
     * 
     * @throws UnsupportedAudioFileException
     * @throws IOException
     */
    protected void initDecodedFormat() throws UnsupportedAudioFileException, IOException {
        AudioFormat baseFormat = audioStream.getFormat();
        decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                                        baseFormat.getChannels(), baseFormat.getChannels() * 2,
                                        baseFormat.getSampleRate(), false);
    }

/**
     * init decoded audio stream
     */
    protected void initDecodedAudioStream() {
        decodedAudioStream = AudioSystem.getAudioInputStream(decodedFormat, audioStream);
    }

/**
     * get source data line
     * 
     * @param input audio input stream
     * @return
     * @throws UnsupportedAudioFileException
     * @throws IOException
     * @throws LineUnavailableException
     */
    protected SourceDataLine getSourceDataLine() throws UnsupportedAudioFileException, IOException,
                                                LineUnavailableException {
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, decodedFormat);
        SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
        line.open(decodedFormat);
        return line;
    }

/**
     * play audio
     * 
     * @throws UnsupportedAudioFileException
     * @throws IOException
     * @throws LineUnavailableException
     */
    protected void play() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
        SourceDataLine line = getSourceDataLine();
        line.start();
        int readLenth = 0;
        while (readLenth != -1) {
            readLenth = decodedAudioStream.read(AUDIO_BUFER, 0, AUDIO_BUFER.length);
            if (readLenth != -1) {
                line.write(AUDIO_BUFER, 0, readLenth);
            }
        }
        line.drain();
        line.stop();
        line.close();
        decodedAudioStream.close();
        audioStream.close();
    }
}

自己写个main方法即可测试  啦啦啦......

public static void main(String[] args) {

Mp3Player mp3Player=new Mp3Player();

String sourcUrl="C:"+File.separator+"879_mp3.mp3";

File file=new File(sourcUrl);

mp3Player.play(file);

}

最后附上简易播放器:见附件

启动方式:linux用户使用./mp3player.sh,windows用户使用mp3player.bat启动(需要说明的是,必须设置好JAVA_HOME和PATH,并且使用jdk5以上版本。因为启动脚本中的指定classpath的方法需要jdk5版本以上才支持。如果是jdk1.4下的用户,请修改启动脚本)
lib目录:是简易播放器的lib包支持
log目录:记录log,如果有错误等情况,可查看log。
conf目录:因为没有图形界面,所以需要把播放的mp3文件路径手工写入。支持两种形式,一个是本地mp3文件,另一个是网络mp3资源,分别写入到local.txt和net.txt文件中。
比如
local.txt

/home/jones/data/music/misc/xin_nian_hao.mp3
/home/jones/data/music/misc/guo_ge.mp3

net.txt

http://lubai.com.cn/CGI-BIN/shuanxing.mp3
http://lubai.com.cn/CGI-BIN/shuanxing.mp3

二、客户端:

http://translate.google.cn/translate_tts?ie=UTF-8&q=这是要发音的文本&tl=zh-CN&total=1&idx=0&textlen=2&client=t&prev=input

这个URL直接返回你要说的话的MP3文件。播放就可以了。

html5:支持 <audio autoplay='true'><source src='<%=path%>/MP3/1.mp3' /></audio>

附件:http://down.51cto.com/data/2365103

本文转自lzf0530377451CTO博客,原文链接:http://blog.51cto.com/8757576/1579618 ,如需转载请自行联系原作者

java mp3播放器 无界面相关推荐

  1. java mp3播放器 ×××面

    一.服务器端: 最近没有系统学习的计划,看了开源的YOYOPlayer(一个相当强大的播放器软件,基于java编写),心里痒痒,比较肤浅的学习下javasound. javasound是比较小巧的底层 ...

  2. java mp3 暂停,Java MP3播放器 - 使用jLayer播放,暂停和搜索不能正常工作

    我正在尝试在java中实现mp3播放器,它将从字节数组中播放音频 . 该类应该像这样工作: 加载用aes加密的mp3文件 将其解密为bytes / inputstream数组 播放变量中的音乐 让用户 ...

  3. java mp3播放器

    我正在用java做一个mp3播放器,有兴趣的同志可以联系我,源代码开放. 主要采用jlayer + swing + hsqldb,仿千千静听,已经实现了千千静听部分功能 有兴趣的同志可以联系QQ:38 ...

  4. java mp3播放器下载_关于java MP3播放器

    展开全部 package baidu; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.* ...

  5. 基于嵌入式Linux的MP3播放器的设计与实现

    摘要:本文详细介绍了嵌入式系统的特点以及嵌入式系统开发的流程,分析基于嵌入式Linux的MP3播放器的关键技术,设计和实现了一种基于嵌入式系统的 MP3 播放器.该播放器利用 QT 技术和开源的音频解 ...

  6. Linux字符界面 MP3播放器

    写在前面:大家好,我是草莓橙须圆.毕业之前在CSDN和微信公众号活跃 欢迎关注我的公众号:[草莓橙须圆] 微信公众号主要就是更新大学生或者考研党的日常 CSDN主要就是学习Java过程中总结的笔记,以 ...

  7. 安卓MP3播放器开发实例(1)之音乐列表界面

    学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...

  8. 安卓java自实现mp3播放器,基于安卓Android的MP3播放器的设计与实现

    基于安卓Android的MP3播放器的设计与实现(含开题报告,毕业论文14000字,程序代码) [摘  要]    本课题致力于开发出一款基于Android手机平台的MP3音乐播放器应用,采用Andr ...

  9. Android MediaPlayer MP3播放器(倍速和音量)的封装和所见的问题

    Android MediaPlayer MP3播放器(倍速和音量)的封装和所见的问题 文章目录 Android MediaPlayer MP3播放器(倍速和音量)的封装和所见的问题 一.技术选型 二. ...

最新文章

  1. 我的车模我做主 - 精美的车模作品
  2. Python 学习笔记 -- 继承与多态(入门级实例)
  3. Ajax监测开始执行及结束执行
  4. “妈妈打工,爸爸是盲人”小学生记错开学时间独自上学,原因心酸
  5. Angular基础(五) 内建指令和表单
  6. 0-1背包(及初始化问题)
  7. IOS15 UICollectionViewController 如何初始化
  8. Ajax初体验(一)
  9. matlab ssgs工具箱,基于PI控制方式的1A开关电源MATLAB仿真研究
  10. 移动app测试的多样性_快速搞定APP移动端自动化测试
  11. 物联网听起来像是一个和互联网不同的网,万物互联又把网给弄丢了,正向我们扑面而来的是万物互联网。...
  12. linux服务器 top 查看 内存占用详情
  13. 130_传析阅管理系统accdb64位版本
  14. 【Kafka】Kafka ERROR [ConsumerFetcherThread-console-consumer], Error for partition [xx,5] to broker 10
  15. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线问卷答题系统
  16. 在JavaScript中创建命名空间的几种写法
  17. c++ file* 句柄泄漏_C/C++连接MySql数据库使用总结
  18. Ubuntu18.04安装CUDA10.1和cuDNN v7.6.5
  19. 生产者-消费者习题的运用
  20. $(...).modal is not a function

热门文章

  1. 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
  2. mac版python3.7怎么使用_【Mac环境】Mac使用python3.7环境
  3. datatables php数据,html5 - datatables 加载不出来数据。
  4. ajax长轮询 java web_Ajax长轮询
  5. lingo 嵌套@for或嵌套@sum
  6. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)...
  7. 2018年计划读书清单
  8. 自动化测试工具的选择
  9. Asp.net 不安全端口 解决chrome浏览器访问时提示:ERR_UNSAFE_PORT
  10. 找回丢失的mysql root 用户密码