如何通过网络发送/同步音频流

时间:2017-08-17 19:58:20

标签: c audio-streaming

我目前正在开发一个流媒体应用程序,用于在我的家庭网络上传输本地(24 / 96,16 / 48)wav文件。

我使用循环连续发送一大块音频并模拟播放,但我在发送器和接收器之间正确同步播放时遇到问题。

这是循环:

    -- using a block size of 192 frames
    int bufsz = 192 * bytes_per_frame;
    char buf [ bufsz ];
    int bytesread = buffer_callback (buf, bufsz);
    int bytes_per_second = bytes_per_frame * samplerate; 
    sleeptime = bytesread * 1000 / bytes_per_second * 1000;
    -- doing this to avoid gaps
    sleeptime = sleeptime - 200;
    usleep (sleeptime);

问题: 随着时间的推移会有延迟。当在服务器端停止时,音频在接收器侧继续播放一段时间。如何正确同步播放?我使用正确的缓冲区大小吗?睡眠时间是否正确计算?我想这是累积的睡眠时间减去200?

提前致谢!

3 个答案:

答案 0 :(得分:0)

您遇到了一个非常有趣的问题:您的发送方和接收方可能在不同的时钟上运行。听起来你的接收器时钟稍慢 - 所以你的接收器不能足够快地播放样本。 你有很多不同的选择:

  • 使用MPEG-2传输流并使用恢复发送方时钟 PCR
  • 在接收器中有一个输入队列,然后向上或向下取样 传入的音频取决于您的队列是否超过流量。
  • 完美地同步发送器和接收器时钟。

答案 1 :(得分:0)

我已经通过用ffmpeg替换sox并使用-re标志来部分解决了这个问题,以防止客户端接收太多。现在,它更好地同步。

答案 2 :(得分:0)

这个answer explains问题是你的时钟漂移问题。由于您的音频源和音频备用设备没有共享的公共时钟,因此您将有时钟漂移。这是时钟晶体变化一些量的时候。如果数据源提供的数据太慢,您的接收器将运行数据并饿死。如果您的源太快地提供数据,它可能会溢出接收器上的某些缓冲区。链接中的答案解释了问题和一些解决方法。