我有一份工作,我必須從桌面上拍攝連續的截圖並捕獲聲音,然後將它們作爲實時視頻流發佈。我使用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());
}
}