【问题标题】:Xuggler audio livestream playback not continuousXuggler 音频直播播放不连续
【发布时间】:2014-05-15 08:15:41
【问题描述】:

我有一份工作,我必须连续截屏并从桌面捕获声音,然后将它们发布为实时视频流。我使用 Wowza Media Server 3.0.3 进行流媒体发布。我还使用 Xuggler 生成图像帧并将它们与声音缓冲区一起放入数据包中。我有以下问题:

我启动我的程序,并且正在发布图像帧和声音包。 Wowza 控制台通知我,数据包已发布。当我打开媒体播放器(在本例中为 VLC)时,流的视频部分就像一个魅力(我看到从我的桌面连续捕获的图像帧),但音频部分很差。我的意思是,当我开始播放直播时,VLC 会缓冲从我的桌面录制的大约 3 秒长的声音部分,并以更高的速度播放。经过较长时间的休息后,它再次缓冲并播放下一部分。在我的代码中,我不断发送以 MP3 编码的声音 iBuffers 并将它们发布到数据包中,所以我无法理解为什么声音没有像图像帧那样连续播放。

谁能得到我的问题的答案或经验?

我从我的代码中复制了一份,我只是在其中流式传输桌面声音,而不是图像帧。 这是 sn-p,我在这里获取声音,并将其发送到编码和发布:

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());
    }
}

【问题讨论】:

    标签: xuggler


    【解决方案1】:

    我们必须进行更多调试才能了解所有相关因素。

    • 通常当音频流以不同的音高播放时,这意味着输入和输出的采样率不匹配。您当前手动将采样格式设置为 FMT_S16,将采样率设置为 44.100 Hz。只要输入已经以这种方式格式化,这将正常工作。

      您可能希望通过在输入和输出之间使用IAudioResampler 来确保数据包具有正确的通道数、采样格式和采样率。使用IMediaWriterIStreamCoder 函数getChannels()getSampleRate() 作为IAudioResampler 的输入。

    • 我对 Wowza Media Server 不熟悉,但它似乎自己执行某种转码。我无法从您的代码中看出,但您似乎是直接流式传输到 Wowza 而不是使用文件容器。您可以尝试输出到文件,然后查看是否可以播放。这样您就可以检查音频/视频数据是否正确编码。

      如果是这样,问题可能出在 Wowza 上。检查它是否对编解码器、样本格式、样本大小、通道、采样率和比特率有任何特殊限制。

      如果输出文件无法播放,请尝试仅写入音频流并忽略任何视频。如果确实可以播放,那么问题出在音频和视频数据的数据包形成。

    • 最后,您能否在编写时尝试输出每个视频帧和音频样本的时间戳?通过这种方式,您可以确保所有数据包都按时间顺序整齐排列。如果在视频文件中的某个时间点,这些数据包的顺序错误,则无法正确流式传输和播放文件。

    例如,这是一个格式错误的视频文件:

    0ms video frame  1
    0ms audio sample 1
    10ms video sample 2
    8ms audio frame 2`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      相关资源
      最近更新 更多