連続してスクリーンショットを撮り、デスクトップからサウンドをキャプチャして、ライブ ビデオ ストリームとして公開する仕事をしています。ストリーム配信には 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());
}
}