Java如何播放MP3格式音频文件,以及如何循环播放音频?

首选,感谢你能在百忙之中阅读我的博客,在这里我告诉大家2中播放MP3格式音频的方法。第一种,使用自带的JavaFX技术来播放(现再最新的JDK版本中已被移除)。第二种我们使用第三方库来进行播放。

点击这里下载第三方库文件

如果找不到下载的地方,可以在我们百度网盘中下载:密码:avpy

当然,如果你觉得在百度网盘中下载太恶心,可以在这里下载 密码: pgb9bo

JavaFX播放MP3,这种方法不需要下载第三方库,比较方便,但是不能直接用在Java Project里面,能直接用在JavaFX Project里面。

这个包里面,有几个重要的类,它们的层次关系是这样的Media->MediaPlayer->MediaView

Meida类用来封装媒体数据

MediaPlayer类用来控制媒体文件的各种行为

MediaView类用来显示媒体,但是我介绍的是播放MP3,所以文中没有这个类。

package com.game.sound;

import java.io.File;
import java.net.URL;

import javafx.application.Application;
import javafx.scene.media.*;
import javafx.stage.Stage;

/*
目前支持的编码格式:

音频:

MP3;

包含非压缩PCM的AIFF;

包含非压缩PCM的WAV;

使用AAC音频的MPEG-4;(MP4)

使用JavaFX播放MP3文件,需要导入javafx.scene.media包
*/
class Sound extends Object {

private Media media;/* 相当于媒体播放器*/
private MediaPlayer mediaPlayer;/* 相当于媒体控制器*/

/*
 播放音乐
 */
public void play() {
	mediaPlayer.play(); /* JavaFX提供的MediaPlayer有播放方法,直接调用即可 */
}

/*
  暂停播放
 */
public void pause() {
	mediaPlayer.pause();/* JavaFX提供的MediaPlayer有暂停方法,直接调用即可*/
}

/*
  停止播放
 */
public void stop() {
	mediaPlayer.stop();/* JavaFX提供的MediaPlayer有停止播放方法,直接调用即可*/
}

/*
  循环播放
 */
public void loop() {
	setPlayCount(MediaPlayer.INDEFINITE);/* this的方法*/
	play();/* this的方法*/
}

/*
  获取现在音乐播放到哪里了
  
  @return 事件(单位秒)
 */
public double getNewTime() {
	return mediaPlayer.getCurrentTime().toSeconds();
}

/*
  设置音乐的声音大小0-1
  
  @param v
             音量
 */
public void setVolume(double v) {
	mediaPlayer.setVolume(v);
}

/*
  
  @param count
             设置媒体文件循环播放的次数
 */
public void setPlayCount(int count) {
	mediaPlayer.setCycleCount(count);
}

/*
  释放媒体文件占用的空间
 */
public void close() {
	mediaPlayer.dispose(); /* 不是用Media类来释放内存,要用MediaPlayer控制类来释放内存*/
	System.gc(); /* 通知JVM内存回收,调用了dispose方法内存并不会马上被回收,会被标记成垃圾,等待下一次垃圾回收的执行,这里我们手动调用*/
}

/*
  
  @param URL
             媒体文件目录,本地文件也要用URL(String)路径
 */
public Sound(String URL, boolean isAutoPlay) {
	this.media = new Media(URL);
	this.mediaPlayer = new MediaPlayer(media);

	mediaPlayer.setAutoPlay(isAutoPlay);
}

/*
  
  @param URL
             虽然直接传入的事URL,但是是不能直接使用,要转成String类型的URL
 */
public Sound(URL URL, boolean isAutoPlay) {
	this(URL.toString(), isAutoPlay);
}

/*
  
  @param file
             最终转换成URL(String)路径
 */
public Sound(File file, boolean isAutoPlay) {
	this(file.toURI().toString(), isAutoPlay);
}

}

public class Main extends Application {

private Sound sound;/* 注意,我这里是为了防止被JVM的垃圾回收给回收掉 */

@Override
public void start(Stage primaryStage) throws Exception {
	/* 直接复制下来没效果可能是因为连接地址失效了 */
	sound = new Sound("http://sc1.111ttt.cn/2017/1/04/26/297262113196.mp3", false);
	sound.loop();/*循环播放*/
}

public static void main(String[] args) {
	launch(args);/* 初始化 */
}

}
使用第三方库播放MP3格式的音频

package com.game.sound;

import java.util.logging.;
import javazoom.jl.decoder.
;
import javazoom.jl.player.*;

public class MySound extends Thread {

private Player player;
private String musicName;

/*加载音乐*/
public MySound(String musicName) {
    this.musicName = musicName;
}

/*播放音乐*/
public void play() {
    try {
        /*我这里的这一种写法要求音频文件要和这个类在同一个包里面*/
        new Player(getClass().getResourceAsStream(musicName)).play();
    } catch (JavaLayerException ex) {
        Logger.getLogger(MySound.class.getName()).log(Level.SEVERE, null, ex);
    }
}

/*循环播放音乐*/
public void loop() {
    this.start();
}

@Override
public void run() {
    while (true) {
        try {
            new Player(getClass().getResourceAsStream(musicName)).play();
        } catch (JavaLayerException ex) {
            Logger.getLogger(MySound.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

}


作者:lemon
来源:レモンガード
原文:https://www.remonkado.com/note/public/detail/ac10fcd76ba61cc0816ba71efd190379.html

发布了1 篇原创文章 · 获赞 0 · 访问量 33
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览