首页 | 注册 | 登陆
首页 >> 技术专栏 >> java文章 >> java基础 

声音的流式播放


作者java 来源java 加入时间:2006年02月21日
摘要:
声音的流式播放
  基本原理:将声音文件中的数据分段读入一字节数组,反复读取与播放。
import java.io.*;
import javax.sound.sampled.*;

转载:转载请保留本信息,本文来自
http://www.51dibs.com
/html/2006/article/info2/a_4f7d6decb7a4b2ae.htm




声音的流式播放


站点:爱心种子小博士 关键字:声音的流式播放




声音的流式播放
  基本原理:将声音文件中的数据分段读入一字节数组,反复读取与播放。
import java.io.*;
import javax.sound.sampled.*;

/**
    The SimpleSoundPlayer encapsulates a sound that can be opened
    from the file system and later played.
*/
public class SimpleSoundPlayer  {

    public static void main(String[] args) {
        // load a sound
        SimpleSoundPlayer sound = new SimpleSoundPlayer("sounds/voice.wav");

        // create the stream to play
        InputStream stream =new ByteArrayInputStream(sound.getSamples());

        // play the sound
        sound.play(stream);

        // exit
        System.exit(0);
    }

    private AudioFormat format;
    private byte[] samples;

    /**
        Opens a sound from a file.
    */
    public SimpleSoundPlayer(String filename) {
        try {
            // open the audio input stream
            AudioInputStream stream =
                AudioSystem.getAudioInputStream(
                new File(filename));

            format = stream.getFormat();

            // get the audio samples
            samples = getSamples(stream);
        }
        catch (UnsupportedAudioFileException ex) {
            ex.printStackTrace();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }


    /**
        Gets the samples of this sound as a byte array.
    */
    public byte[] getSamples() {
        return samples;
    }


    /**
        Gets the samples from an AudioInputStream as an array
        of bytes.
    */
    private byte[] getSamples(AudioInputStream audioStream) {
        // get the number of bytes to read
        int length = (int)(audioStream.getFrameLength() *
            format.getFrameSize());

        // read the entire stream
        byte[] samples = new byte[length];
        DataInputStream is = new DataInputStream(audioStream);
        try {
            is.readFully(samples);
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // return the samples
        return samples;
    }


    /**
        Plays a stream. This method blocks (doesnt return) until
        the sound is finished playing.
    */
    public void play(InputStream source) {

        // use a short, 100ms (1/10th sec) buffer for real-time
        // change to the sound stream
        int bufferSize = format.getFrameSize() *
            Math.round(format.getSampleRate() / 10);
        byte[] buffer = new byte[bufferSize];

        // create a line to play to
        SourceDataLine line;
        try {
            DataLine.Info info =
                new DataLine.Info(SourceDataLine.class, format);
            line = (SourceDataLine)AudioSystem.getLine(info);
            line.open(format, bufferSize);
        }
        catch (LineUnavailableException ex) {
            ex.printStackTrace();
            return;
        }

        // start the line
        line.start();

        // copy data to the line
        try {
            int numBytesRead = 0;
            while (numBytesRead != -1) {
                numBytesRead =
                    source.read(buffer, 0, buffer.length);
                if (numBytesRead != -1) {
                   line.write(buffer, 0, numBytesRead);
                }
            }
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // wait until all data is played, then close the line
        line.drain();
        line.close();

    }

}



发布人:love
→ 推荐给我的好友 → 报告错误链接
上篇文章:一个用DES来加密、解密的类
下篇文章:背包问题的穷举解法
〖文章打印〗
〖关闭窗口〗
发表评论
查看评论
中“声音的流式播放”相关内容 中“声音的流式播放”相关内容
中“声音的流式播放”相关内容 中“声音的流式播放”相关内容
中“声音的流式播放”相关内容 中“声音的流式播放”相关内容

关于我们网站留言友情链接与我在线与我聊天领取红包管理TOP