【问题标题】:How to send/sync audio stream over a network如何通过网络发送/同步音频流
【发布时间】:2017-08-17 19:58:19
【问题描述】:

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

我使用循环连续发送一段音频并模拟播放,但我无法让播放在发送方和接收方之间正确同步。

这是循环:

-- 使用 192 帧的块大小 int bufsz = 192 * bytes_per_frame; 字符 buf [ bufsz ]; int bytesread = buffer_callback (buf, bufsz); int bytes_per_second = bytes_per_frame * 采样率; 睡眠时间 = bytesread * 1000 / bytes_per_second * 1000; -- 这样做是为了避免空白 睡眠时间 = 睡眠时间 - 200; 睡眠(睡眠时间);

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

提前致谢!

【问题讨论】:

  • 什么延迟?你为什么睡觉?
  • 那声音是不是断断续续的?
  • 我睡觉是为了模拟播放。延迟是当我在服务器前端点击停止时,播放不会立即在客户端停止。希望我很清楚。
  • 不,音频不断断续续,只有我不从睡眠时间中减去 200 时,才会断断续续。
  • 我也在睡觉,让前端的进度指示器与播放同步。如果我不这样做,我就会失去对客户端正在播放的内容的控制,并且当我向前搜索时,客户端可能无法及时响应。

标签: c audio-streaming


【解决方案1】:

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

  • 使用 MPEG-2 传输流并使用以下方法恢复发送器时钟 聚合酶链反应。
  • 在您的接收器中有一个输入队列,然后向上或向下采样您的 传入的音频取决于您的队列是溢出还是溢出。
  • 完美同步发送器和接收器时钟。

【讨论】:

  • 感谢您的建议。看我的回答。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2020-11-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      相关资源
      最近更新 更多