一、服务器端:

最近没有系统学习的计划,看了开源的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>

转载于:https://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. 安卓java自实现mp3播放器,基于安卓Android的MP3播放器的设计与实现

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

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

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

  7. 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器

    上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边 ...

  8. 我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

    大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上 ...

  9. android开发--mp3播放器项目源代码(xml文件解析,.lrc,.mp3文件下载,同时显示歌词)

    一.mp3播放器源代码 1.MainActivity.java:在此中主要负责播放器首页的功能,包括服务器上的下载列表,和SD卡上已经下载的mp3文件列表package com.wyt.MP3play ...

最新文章

  1. 让SEQUENCE记录不变的信息【RECORD STATIC NUMBER IN SEQUENCE】
  2. 创建与合并分支-git入门教程
  3. supost a second hand marketing place at stanford
  4. 国外的程序猿可以工作到退休而国内的为什么这么短命(思维认知)
  5. PCL之体素网格滤波器--VoxelGrid
  6. 微积分的未来:DNA、非线性、混沌、复杂系统与人工智能
  7. 一句理解到底什么是雷达中的波位
  8. java pgm_用Java读取pgm文件
  9. 【边学边记_10】——8 位7段数码管的动态显示
  10. 怎么查看笔记本内存条型号_怎么看电脑内存条型号 电脑内存条型号查看方法【详解】...
  11. php如何ping域名的ip,使用PHP ping域名或IP
  12. 一篇最通俗易懂的性能调优总结,这篇就够了
  13. 坑爹的AWS免费服务
  14. C语言程序设计-翁恺(初学者日记)
  15. 你应该知道的Android签名知识
  16. Hadoop分布式集群的搭建
  17. YTU OJ Problem 3013
  18. 美国Linux服务器系统内核的详细介绍
  19. 吃鸡过后末日题材成新宠?6月末日新游扎堆,绝不只是代号:生机
  20. 护眼台灯真的护眼吗?为家长推荐四款真正护眼的台灯

热门文章

  1. C++ pair的使用
  2. 【转】Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04
  3. SpringBoot05 数据操作01 - JPA的基本使用、基本使用02
  4. Java EE 简介
  5. C#DataGrdviewl加入checkBox全选删除
  6. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法
  7. 客户端脚本验证码总结一
  8. 数据可视化之 星图
  9. kettle中的switch_Kettle学习笔记(二)— 基本操作
  10. mysql 密码 特殊符号_MySQL数据库之mysql设置复杂密码中含$特殊符号导致无法命令行登录...