![libav - 透過 UDP 串流音訊會導致讀滿或欠載](https://rvso.com/image/1497481/libav%20-%20%E9%80%8F%E9%81%8E%20UDP%20%E4%B8%B2%E6%B5%81%E9%9F%B3%E8%A8%8A%E6%9C%83%E5%B0%8E%E8%87%B4%E8%AE%80%E6%BB%BF%E6%88%96%E6%AC%A0%E8%BC%89.png)
我正在將小音訊檔案從一個樹莓派傳輸到其他幾個樹莓派。無線連線良好、吞吐量良好、ping/延遲良好。
接收器看起來像這樣:
avplay -probesize 32 -f mp3 -vn -i udp://239.255.0.1:8001
當我像這樣發送音訊串流(使用-re)時:
avconv -re -i 1.wav -f mp3 -b:a 128K -vn udp://239.255.0.1:81?localaddr=192.168.0.1
接收器上的結果是斷斷續續的音頻,其中有很多:
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred0B f=0/0
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred0B f=0/0
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred0B f=0/0
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred0B f=0/0
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred0B f=0/0
當我發送音訊串流(不使用 -re)時,如下所示:
avconv -i 1.wav -f mp3 -b:a 128K -vn udp://239.255.0.1:81?localaddr=192.168.0.1
接收器上的結果是跳躍的音頻,其中有很多這樣的內容:
[mp3 @ 0x72501740] overread, skip -10 enddists: -7 -7 0B f=0/0
[mp3 @ 0x72501740] overread, skip -7 enddists: -5 -5
[mp3 @ 0x72501740] overread, skip -9 enddists: -6 -6 0B f=0/0
[mp3 @ 0x72501740] overread, skip -5 enddists: -1 -1 0B f=0/0
[mp3 @ 0x72501740] overread, skip -7 enddists: -2 -2
如果我增加接收器上的探測大小,我播放的第一個聲音很好,而隨後的聲音很糟糕,因為探測大小僅在最初適用。
實際問題:我怎麼能讓 avplay 連續正確地緩衝輸入,這樣就不會發生欠載和過度讀取/跳過?
答案1
我現在正在使用:
avplay -probesize 32 -f mp3 -vn -i udp://239.255.0.1:8001?buffer_size=400000
這似乎有幫助,我相信任何進一步的跳過都是由於無線幹擾和我使用 UDP 的事實。