简体   繁体   English

如何从数组中随机播放和播放音频文件

[英]How to shuffle and play an audio file from an array

I have some problems with my code, I want to shuffle a file array that contains .mp3 audio files and play one file from it when a button is clicked!!我的代码有一些问题,我想打乱一个包含 .mp3 音频文件的文件数组,并在单击按钮时从中播放一个文件!! I absolutely have no Idea on how to do this, I need some help, real help!!我完全不知道如何做到这一点,我需要一些帮助,真正的帮助!! Here is my code!..... It runs but it plays all files at once.... I want it to randomize, and play just one out of the files.这是我的代码!..... 它运行但它一次播放所有文件......我希望它随机化,并且只播放文件中的一个。

import javax.swing.*;

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.util.Random;

public class Quest1 extends JFrame {

    String word [] = { "C:/Users/HP/Desktop/eclipse/audio.wav",
            "C:/Users/HP/Desktop/eclipse/baby.wav",
            "C:/Users/HP/Desktop/eclipse/board.wav",
            "C:/Users/HP/Desktop/eclipse/bomb.wav",
            "C:/Users/HP/Desktop/eclipse/gym.wav",
            "C:/Users/HP/Desktop/eclipse/football.wav",
            "C:/Users/HP/Desktop/eclipse/school.wav",
            "C:/Users/HP/Desktop/eclipse/keyboard.wav",
            "C:/Users/HP/Desktop/eclipse/computer.wav",
            "C:/Users/HP/Desktop/eclipse/name.wav"  };


    JButton click;      

    public Quest1 () {

        getContentPane().setBackground(Color.DARK_GRAY);

        setLayout(new GridBagLayout());

        GridBagConstraints g = new GridBagConstraints();


        g.anchor = GridBagConstraints.CENTER;
        g.gridx = 4;
        g.gridy = 5;
        g.gridwidth = 2;
        g.insets = new Insets (50, 2, 2, 2);
        g.fill = GridBagConstraints.CENTER;
        fill = new JTextField(15);
        add (fill, g);

        g.anchor = GridBagConstraints.CENTER;
        g.gridx = 4;
        g.gridy = 8;
        g.gridwidth = 2;
        g.insets = new Insets (30, 2,2,2);
        click = new JButton("Play");
        add(click, g);

        click.addActionListener (new ActionListener (){
            public void actionPerformed (ActionEvent x) {

                Random rand = new Random();
                    for (int i = 0; i < word.length;) {
                        int random = rand.nextInt(word.length);
                        String temp = word[i];
                        word [i] = word[random];
                        word[random] = temp;

                        InputStream in =null;
                        AudioStream out = null;
                            try {
                                in = new FileInputStream(temp);
                            } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            try {
                                out = new AudioStream(in);
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }       
                            AudioPlayer.player.start(out);
                    }       
                    return;
            }
        });     
    }
}

If it is a normal java array holding the files you want to play, the easiest approach is to simply generate a random index and get object with that index from the array:如果它是一个普通的 java 数组,其中包含您要播放的文件,最简单的方法是简单地生成一个随机索引并从数组中获取具有该索引的对象:

//Index of the random song
int r = (int) (Math.random() * (songs.length - 1);
//Get the song from the array
songs[r]
...

Edit:编辑:

You said you want to play ONE random sound from the array, by know your code just plays ALL of your files in the array in the correct order.你说你想从数组中播放一个随机声音,知道你的代码只是以正确的顺序播放数组中的所有文件。

If you only want to play ONE, than you have to remove the for loop.如果您只想玩 ONE,则必须删除for循环。

Correct code:正确代码:

click.addActionListener (new ActionListener (){
        public void actionPerformed (ActionEvent x) {
            //Get random filepath from the array
            Random rand = new Random();
            int random = rand.nextInt(word.length);
            String temp = word[random];

            InputStream in =null;
            AudioStream out = null;
            //Get the actual file from the path
            try {
                in = new FileInputStream(temp);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            try {
                out = new AudioStream(in);
            } catch (IOException e) {
                e.printStackTrace();
            }       
            //Play the file
            AudioPlayer.player.start(out);
            return;
        }
    });     

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM