zhangfan20161228 2017-04-11 02:20 采纳率: 25%
浏览 2389
已采纳

Java swing音频播放问题

求教各位大神,想要实现音频播放功能,具体是打开文件选择器选择音频文件并显示文件路径在文本框中,
然后点击播放开始播放该音频,点击暂停能使音频暂停播放。新手,急求!最好能详细些

  • 写回答

2条回答 默认 最新

  • followwwind 2017-04-11 04:18
    关注

    package com.musicplayer.bean;

    import java.io.File;
    import java.io.IOException;

    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;
    import javax.sound.sampled.UnsupportedAudioFileException;

    public class Player extends Thread{

    /**
     * 播放标志
     */
    private boolean flag = false;
    private boolean pause = false; //暂停标志
    private boolean threadflag = false; //该线程是否启动
    private AudioInputStream audioInputStream;// 文件流
    private AudioFormat audioFormat;// 文件格式
    private SourceDataLine sourceDataLine;// 输出设备
    Object lock = new Object();//一个空的对象,没什么意义
    private File musicfile;
    
    public Player() {
    
    }
    
    public Player(File musicfile) {
        this.musicfile = musicfile;
    }
    
    public boolean existFile(){
        return musicfile != null ? true : false;
    }
    
    public void loadMusicFile(){
        // 取得文件输入流
        try {
            audioInputStream = AudioSystem.getAudioInputStream(musicfile);
            audioFormat = audioInputStream.getFormat();
            // 转换mp3文件编码
            if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
                audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                        audioFormat.getSampleRate(), 16, audioFormat
                                .getChannels(), audioFormat.getChannels() * 2,
                        audioFormat.getSampleRate(), false);
                audioInputStream = AudioSystem.getAudioInputStream(audioFormat,
                        audioInputStream);
            }
            // 打开输出设备
            DataLine.Info dataLineInfo = new DataLine.Info(
                    SourceDataLine.class, audioFormat,
                    AudioSystem.NOT_SPECIFIED);
            sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
            sourceDataLine.open(audioFormat);
    
        } catch (UnsupportedAudioFileException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (LineUnavailableException e1) {
            e1.printStackTrace();
        }
    }
    
    public void startplay(){
        if(pause){
            synchronized(lock) {
                pause = false;
                lock.notifyAll();
            }
        }
        flag = true;
    }
    
    public void pauseplay(){
        pause = true;
    }
    
    public void stopplay(){
        flag = false;
    }
    
    @Override
    public void run() {
        loadMusicFile();
        threadflag = true;
        byte[] data = new byte[4096];
        int nBytesRead;
        if(sourceDataLine != null){
            synchronized (lock) {
                try {
                    while ((nBytesRead = audioInputStream.read(data, 0, data.length)) != -1) {
                        while(pause){
                            if(sourceDataLine.isRunning()) {
                                sourceDataLine.stop();
                                //System.out.println("暂停");
                            }
                            try {
                                lock.wait();
                                //System.out.println("等待");
                            }catch(InterruptedException e) {
    
                            }
                        }
    
                        if(flag){
                            sourceDataLine.start();
                        }else{
                            sourceDataLine.drain();
                            sourceDataLine.stop();
                            sourceDataLine.close();
                        }
                        sourceDataLine.write(data, 0, nBytesRead);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public boolean isStart(){
        return threadflag;
    }
    
    public File getMusicfile() {
        return musicfile;
    }
    
    public void setMusicfile(File musicfile) {
        this.musicfile = musicfile;
    }
    

    }

    Player musicplayer = new Player(file); //file为mp3文件
    //播放
    musicplayer.startplay();
    if (!musicplayer.isStart() && musicplayer.existFile()) {
    musicplayer.start();
    }
    //暂停
    musicplayer.pauseplay();
    下图为我做的播放器demo,有点粗糙
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿