使用Java& JSP流式传输音频块(mp3),通过servletOutputStream进行实时回放

时间:2012-09-10 09:47:03

标签: java jsp audio-streaming outputstream buffering

我正在尝试播放音频并保持连续,不会出现跳跃或空白点。我必须首先在块中接收字节并将其转换为mp3以由servletOutputStream进行流式传输。一旦消费者收集了足够的字节以试图保持恒定的音频流,我才开始播放。正如您所看到的,我已经对此缓冲区进行了硬编码,但希望它适用于任何大小的音频字节。我想知道是否有人遇到类似问题并有任何建议吗?

提前致谢。任何帮助将不胜感激。

public class Consumer extends Thread {

    private MonitorClass consBuf;
    private InputStream mp3InputStream = null;
    private OutputStream OutputStream = null;

    public Consumer (MonitorClass buf, OutputStream servlet) 
        {
        consBuf = buf;
        OutputStream = servlet;
        }

    public void run() 
    {
        byte[] data;
        byte[] tempbuf;
        int byteSize = 60720; //This should be dynamic
        int byteIncrement = byteSize;
        int dataPlayed = 0;
        int start = 0;
        int buffer = 0;
        boolean delay = true;

        AudioFormat generatedTTSAudioFormat = getGeneratedAudioFormat();

        try
        {       
            while(true) 
            {
                try 
                {
                    data = consBuf.get(); //gets data from producer using a shared monitor class

                    if(data.length >= byteSize) //Buffer size hit, start playing
                    {
                        if(delay) //help with buffering
                        {
                            System.out.println("Pre-delay...");
                            consBuf.preDelay();
                            delay = false;
                        }

                        tempbuf = new byte[byteIncrement];

                        arraySwap(data, tempbuf, start, byteSize);

                        System.out.println("Section to play: " + start + ", " + byteSize);

                        mp3InputStream = FishUtils.convertToMP3( new ByteArrayInputStream(tempbuf), generatedTTSAudioFormat);

                        copyStream(mp3InputStream, OutputStream);

                        System.out.println("Data played: " + byteSize);
                        System.out.println("Data collected: " + consBuf.getDownloadedBytes() );
                        dataPlayed = byteSize;
                        start = byteSize;
                        byteSize += byteIncrement;
                    }

                    if( consBuf.getIsComplete() )
                    {
                        if (consBuf.checkAllPlayed(dataPlayed) > 0)
                        {
                            System.out.println("Producer finished, play remaining section...");

                            //mp3InputStream = convertToMP3(new ByteArrayInputStream(tempbuf), generatedTTSAudioFormat);

                            //copyStream(mp3InputStream, OutputStream);
                        }

                        System.out.println("Complete!");
                        break;  

                    }

                }  
                catch (Exception e) 
                {
                    System.out.println(e);
                    return;
                }
            }
        }
        finally
        {
            if (null != mp3InputStream)
            {
                try
                {
                    mp3InputStream.skip(Long.MAX_VALUE);
                }
                catch (Exception e)
                {}
            }

            closeStream(mp3InputStream);
            closeStream(OutputStream);
        }
    }
}

0 个答案:

没有答案