我有一份工作,我必须连续截屏并从桌面捕获声音,然后将它们发布为实时视频流。我使用 Wowza Media Server 3.0.3 进行流媒体发布。我还使用 Xuggler 生成图像帧并将它们与声音缓冲区一起放入数据包中。我有以下问题:
我启动我的程序,图像帧和声音包的发布正在进行中。Wowza 控制台通知我,数据包已发布。当我打开媒体播放器(在本例中为 VLC)时,流的视频部分就像一个魅力(我看到从我的桌面连续捕获的图像帧),但音频部分很差。我的意思是,当我开始播放直播时,VLC 会缓冲从我的桌面录制的大约 3 秒长的声音部分,并以更高的速度播放。经过较长时间的休息后,它再次缓冲并播放下一部分。在我的代码中,我不断发送以 MP3 编码的声音 iBuffer 并将它们发布到数据包中,所以我无法理解为什么声音没有像图像帧那样连续播放。
任何人都可以得到我的问题的答案或任何经验吗?
我已经从我的代码中复制了一份,我只是在其中流式传输桌面声音,而不是图像帧。这是片段,我在其中获取声音,并将其发送到编码和发布:
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());
}
}