作者teslare (每次下中华队都输...orz)
看板Programming
标题Re: [问题] 声音传输
时间Sun Dec 19 16:44:14 2010
※ 引述《CSLabor (电脑工人)》之铭言:
: 请问一下
: 如果我把A端的音乐档切成一小块一小块传给B
: 再由B将其音乐一小块一小块播出来
: 并保证B端音乐播放的流畅性
:
: 这样的串流传输过程
: 请问有相关的资料吗?
: 网路上似乎找不太到资料说
:
: 在这边先谢谢有经验的前辈帮我解答
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 125.225.135.211
: ※ CSLabor:转录至看板 C_and_CPP 12/18 08:56
: 推 stool100:FIFO 当 buffer 220.132.235.209 12/18 12:53
: → CSLabor:感谢楼上 但是是Client-Server传送 125.225.135.12 12/18 13:22
: → CSLabor:不是Process间传送 125.225.135.12 12/18 13:22
: 推 uziel:切割和播放的部分我没做过,但是这种即时 111.82.106.126 12/18 13:47
: → uziel:播放多媒体资料的网路封包应该是以 UDP 协定 111.82.106.126 12/18 13:48
: → uziel:来传送,也就是 server 丢出封包之後就 111.82.106.126 12/18 13:50
: → uziel:不检查封包的下落,如果封包有丢失, client 111.82.106.126 12/18 13:51
: → uziel:端看/听起来就是 lag 。 111.82.106.126 12/18 13:52
经过的路人乙来回答一下
一楼的推文就是正解,FIFO是一个非常广泛的概念
即使你坐公车排队也是FIFO,并不单指process之间传输
(原po作业系统和程式语言这两门课可能有点不太认真喔 :p)
至於u同学的疑虑也颇有道理,如果要使用UDP要仔细考虑网路的可用度
不过,UDP掉音讯封包的结果多半不是lag (因为他没有retransmission)
而是掉少量封包造成爆音、杂音
我的建议是
第一步:先去找一份录音程式的sample code来研读
了解录音、放音所需API,并尝试改code在录音未终止时就取用buffer
将整段录音存成数个至数十个size差不多的零碎档案
第二步:写另一个程式将这些零碎的档案循序读取并播放
第三步:找一份两点间网路传输的sample code来研读
了解listen port、开thread处理incoming connection等等网路基本技巧
第四步:把前三步整合起来
(A)录音thread边录边丢进buffer
(A)传送thread在buffer有资料时就往外丢封包
(B)接收thread收到封包就丢进buffer
(B)播放thread在buffer有资料时就往音效装置送
这样就可以了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.240.214.84
1F:→ teslare:至於"保证流畅性"...实作起来非常麻烦 111.240.214.84 12/19 16:52
2F:→ teslare:建议原po还是先不要想那麽远,基本的先做 111.240.214.84 12/19 16:52