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