2017-08-17 86 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您的時鐘漂移問題。由於您的音頻源和音頻回放設備沒有共享的公共時鐘,因此您將會產生時鐘漂移。這是時鐘晶體的變化量。如果信息來源提供的數據太慢,您的接收機將運行數據並捱餓。如果您的源提供的數據太快,它可能會溢出接收器上的一些緩衝區。鏈接中的答案解釋了問題和一些解決方法。