我有一份工作,我必须连续截屏并从桌面捕获声音,然后将它们发布为实时视频流。我使用Wowza Media Server 3.0.3进行流发布。我还使用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());
}
}
答案 0 :(得分:0)
我们必须再调试一下才能了解所有相关因素。
通常以不同音高播放音频流时,表示输入和输出的采样率不匹配。您当前正在手动将样本格式设置为 FMT_S16 ,采样率设置为 44.100 Hz 。只要输入已经以这种方式格式化,这将正常工作。
您可能希望通过在输入和输出之间使用IAudioResampler
来确保数据包具有正确的通道数,样本格式和采样率。使用IMediaWriter
和IStreamCoder
函数getChannels()
和getSampleRate()
作为IAudioResampler
的输入。
我不熟悉 Wowza Media Server ,但似乎它本身就会进行某种转码。我无法从您的代码中看出来,但似乎您直接流式传输到Wowza而不是使用文件容器。您可以尝试输出到文件,然后查看是否可以播放它。这样您就可以检查音频/视频数据是否正确编码。
如果是,问题可能在于Wowza。检查它是否对编解码器,样本格式,样本大小,通道,采样率和比特率有任何特殊限制。
如果输出文件没有播放,请尝试编写音频流并忽略任何视频。如果确实如此,则问题在于音频和视频数据的数据包形成。
最后,您可以在编写时尝试输出每个视频帧和音频样本的时间戳吗?这样,您可以确保所有数据包按时间顺序整齐排列。如果在视频文件中的某些时刻这些数据包的顺序错误,则无法正确地流式传输和播放该文件。
例如,这是格式错误的视频文件:
0ms video frame 1
0ms audio sample 1
10ms video sample 2
8ms audio frame 2`