2

我正在尝试播放音频并使其保持连续且没有跳过或空白点。我必须首先以块的形式接收字节并将其转换为 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);
        }
    }
}
4

0 回答 0