2017-08-17 87 views
1

我目前正在使用流式传输应用程序在本地网络上传输本地(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积累?

在此先感谢!

+0

什么延迟?你为什么要睡觉? –

+0

然后是音频波涛汹涌? –

+0

我睡觉以模拟播放。延迟是当我在服务器前端停止播放时,播放不会立即停止在客户端。希望我清楚。 – mdlfdbck

回答

0

您遇到了一个非常有趣的问题:您的发件人和接收者可能运行在不同的时钟上。这听起来像是你的接收机时钟速度稍慢 - 所以你的接收机不能足够快地播放样本。 你有一堆不同的选择:

  • 使用MPEG-2传输流和恢复使用 PCR发送时钟。
  • 在您的接收器中有一个输入队列,然后向上或向下采样您的输入音频,具体取决于您的队列是否处于流动状态。
  • 完美地同步发送者和接收者时钟。
+0

感谢您的建议。看到我的答案。 – mdlfdbck

0

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

0

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