我目前正在开发一个流媒体应用程序,用于在我的家庭网络上传输本地(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)
您遇到了一个非常有趣的问题:您的发送方和接收方可能在不同的时钟上运行。听起来你的接收器时钟稍慢 - 所以你的接收器不能足够快地播放样本。 你有很多不同的选择:
答案 1 :(得分:0)
我已经通过用ffmpeg替换sox并使用-re标志来部分解决了这个问题,以防止客户端接收太多。现在,它更好地同步。
答案 2 :(得分:0)
这个answer explains问题是你的时钟漂移问题。由于您的音频源和音频备用设备没有共享的公共时钟,因此您将有时钟漂移。这是时钟晶体变化一些量的时候。如果数据源提供的数据太慢,您的接收器将运行数据并饿死。如果您的源太快地提供数据,它可能会溢出接收器上的某些缓冲区。链接中的答案解释了问题和一些解决方法。