使用Java&;用于通过servletOutputStream进行实时播放的JSP
我试图播放音频,并保持其连续性,没有跳过或空白点。我必须首先以字节的形式接收数据块,并将其转换为mp3,以便通过servletOutputStream进行流式传输。我只在消费者收集了足够的字节后才开始播放,以保持恒定的音频流。正如你所看到的,我已经硬编码了这个缓冲区,但希望它能适用于任何大小的音频字节。我想知道是否有人遇到过类似的问题,并有什么建议 提前谢谢。任何帮助都将不胜感激使用Java&;用于通过servletOutputStream进行实时播放的JSP,java,jsp,audio-streaming,outputstream,buffering,Java,Jsp,Audio Streaming,Outputstream,Buffering,我试图播放音频,并保持其连续性,没有跳过或空白点。我必须首先以字节的形式接收数据块,并将其转换为mp3,以便通过servletOutputStream进行流式传输。我只在消费者收集了足够的字节后才开始播放,以保持恒定的音频流。正如你所看到的,我已经硬编码了这个缓冲区,但希望它能适用于任何大小的音频字节。我想知道是否有人遇到过类似的问题,并有什么建议 提前谢谢。任何帮助都将不胜感激 public class Consumer extends Thread { private Monito
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);
}
}
}
请原谅,我不明白你的问题和JSP有什么关系。是否要在网页中嵌入音频播放?很抱歉造成混淆,我尚未包含所有代码。这是一个jsp文件。是的,音频通过网页播放。servlet outputstream被传递给使用者。我的问题是如何在没有跳转的情况下对其进行流处理。也许您可以提供JSP。您检查了吗?JSP只是设置了servletOutputStream。然后从我的web页面将jsp作为web服务调用。我目前拥有的代码可以工作,并从服务器返回实时音频字节。我的问题是创建某种缓冲区,这样我可以在服务器端的制作人将字节写入相互字节数组时顺利地播放,而不会跳过。谢谢,我来看看这个。对不起,我不明白你的问题与JSP有什么关系。是否要在网页中嵌入音频播放?很抱歉造成混淆,我尚未包含所有代码。这是一个jsp文件。是的,音频通过网页播放。servlet outputstream被传递给使用者。我的问题是如何在没有跳转的情况下对其进行流处理。也许您可以提供JSP。您检查了吗?JSP只是设置了servletOutputStream。然后从我的web页面将jsp作为web服务调用。我目前拥有的代码可以工作,并从服务器返回实时音频字节。我的问题是创建某种缓冲区,在服务器端的制作人将字节写入一个共同的字节数组时,它允许我在不跳过的情况下顺利播放。谢谢,我来看看这个。