我有一份工作,我必须从桌面上拍摄连续的截图并捕获声音,然后将它们作为实时视频流发布。我使用Wowza Media Server 3.0.3进行流发布。我还使用Xuggler生成图像帧并将它们与声音缓冲区一起放入数据包中。我有以下问题:Xuggler音频直播播放不连续
我开始我的程序,并正在发布图像帧和声音数据包。 Wowza控制台告诉我,数据包已发布。当我打开一个媒体播放器(在这种情况下是VLC)时,流的视频部分就像一个魅力(我可以看到从我的桌面上持续拍摄的图像),但音频部分非常差。我的意思是,当我开始播放直播时,VLC会缓存从我的桌面录制的大约3秒长的声音部分,并以更高的速度播放它。经过较长时间的休息后,再次缓冲并播放下一部分。在我的代码中,我不断发送用MP3编码的声音iBuffers并将它们发布到数据包中,所以我不明白为什么声音不能像图像帧一样连续播放。
任何人都可以得到答案或任何经验在我的问题?
我从我的代码中创建了一个副本,我只是在桌面上声音流,而不是图像帧。 这是片段,在那里我得到的声音,并将其发送到编码和发布:
while (true)
{
byte buffer[] = new byte[line.available()];
int count = line.read(buffer, 0, buffer.length);
IBuffer iBuf = IBuffer.make(null, buffer, 0, count);
//Itt írjuk a stream-be az audioframe-et
_AudioWriter.encodeFrameToStream(iBuf, buffer, firstTimeStamp);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这是一部分,在那里我得到了iBuffer并将其编码为MP3。我发布后,作为包:
public void encodeFrameToStream(IBuffer ibuffer, byte[] buffer, long firstTimeStamp) {
long now = System.currentTimeMillis();
long timeStamp = (now - firstTimeStamp);
IAudioSamples outChunk = IAudioSamples.make(ibuffer, 1, IAudioSamples.Format.FMT_S16);
if (outChunk == null)
{
return;
}
long numSample = buffer.length/outChunk.getSampleSize();
outChunk.setComplete(true, numSample, 44100, 1, Format.FMT_S16, timeStamp);
//System.out.println(outChunk + " =========== " + outChunk.getPts());
IPacket packet2 = IPacket.make();
packet2.setStreamIndex(0);
getCoder2().encodeAudio(packet2, outChunk, 0);
outChunk.delete();
if (packet2.isComplete()) {
//System.out.println("completed");
getContainer().writePacket(packet2);
//System.out.println("Size: "+packet2.getSize());
}
}