多媒體通信同步方法肚逸,主要有時(shí)間戳同步法爷辙、同步標(biāo)記法彬坏、多路復(fù)用同步法三種。下面主要討論時(shí)間戳同步法膝晾,特別是RTP時(shí)間戳同步栓始。內(nèi)容包括RTP媒體間同步的實(shí)現(xiàn),為什么需要RTCP的NTP時(shí)間來(lái)實(shí)現(xiàn)媒體間同步血当?沒(méi)有RTCP幻赚,能實(shí)現(xiàn)RTP媒體間的同步嗎?DirectShow時(shí)間戳和RTP時(shí)間戳的區(qū)別臊旭,MPEG2-TS流的時(shí)間戳等坯屿。本文只簡(jiǎn)單討論時(shí)間戳同步的原理,不涉及具體的實(shí)現(xiàn)方法巍扛,如音頻幀和視頻幀時(shí)間戳的計(jì)算方法领跛,怎樣根據(jù)時(shí)間戳去做音視頻的呈現(xiàn)等。
根據(jù)RTP規(guī)范撤奸,不同的RTP媒體流是分開(kāi)傳輸?shù)姆驼眩沂褂酶髯元?dú)立的時(shí)間戳進(jìn)行同步。假設(shè)在一次視頻點(diǎn)播中胧瓜,傳輸兩路RTP媒體流矢棚,一路視頻,一路音頻府喳。根據(jù)視頻幀時(shí)間戳蒲肋,可以實(shí)現(xiàn)視頻流內(nèi)同步,這很好理解钝满,通過(guò)視頻幀時(shí)間戳可以計(jì)算出相鄰視頻幀的時(shí)間間隔兜粘,也就是視頻幀之間的相對(duì)時(shí)間關(guān)系很容易通過(guò)時(shí)間戳來(lái)確定,按照這個(gè)間隔去呈現(xiàn)視頻弯蚜,就可以獲得較好的效果孔轴。同理,音頻流也可以實(shí)現(xiàn)自身的同步碎捺。
那么音頻和視頻這兩路媒體間如何實(shí)現(xiàn)同步呢路鹰?我們只使用音視頻的RTP時(shí)間戳,看能否實(shí)現(xiàn)媒體間的同步收厨。音視頻的RTP時(shí)間戳的增長(zhǎng)速率一般是不同的晋柱,但沒(méi)關(guān)系,知道了具體的單位后诵叁,兩者是可以通過(guò)單位換算聯(lián)系起來(lái)的雁竞。如下圖:
現(xiàn)在來(lái)看,這種方法好像可以實(shí)現(xiàn)同步黎休,因?yàn)橐粢曨l被映射到同一個(gè)時(shí)間軸上了浓领,音頻和視頻幀間的相對(duì)關(guān)系很清楚玉凯。慢著,RTP規(guī)范要求時(shí)間戳的初始值應(yīng)該是一個(gè)隨機(jī)值联贩,那么假設(shè)音頻幀時(shí)間戳的初始值是隨機(jī)值1234漫仆,視頻幀時(shí)間戳的初始值是隨機(jī)值5678,看起來(lái)應(yīng)該是下面這樣:
這么做合適嗎泪幌?我們把音頻幀時(shí)間戳1234和視頻幀時(shí)間戳5678對(duì)應(yīng)到絕對(duì)時(shí)間軸的0上盲厌,我們這么做的理由是什么?你可能會(huì)說(shuō)祸泪,因?yàn)槟鞘堑谝粋€(gè)音頻幀和第一個(gè)視頻幀吗浩,所以可以對(duì)應(yīng)到同一個(gè)點(diǎn)上,在第一幅圖中我們就是這么做的没隘,把音頻幀時(shí)間戳0和視頻幀時(shí)間戳0對(duì)應(yīng)到絕對(duì)時(shí)間軸的0上懂扼。但是RTP規(guī)范并沒(méi)有規(guī)定第一個(gè)視頻幀的時(shí)間戳和第一個(gè)音頻幀的時(shí)間戳必須或者應(yīng)該對(duì)應(yīng)到絕對(duì)時(shí)間軸的同一個(gè)點(diǎn)上,從整個(gè)RTP規(guī)范中不能直接得出這樣的結(jié)論右蒲,也推導(dǎo)不出這樣的結(jié)論阀湿。
我們上面兩幅圖所做的轉(zhuǎn)換是不正確的,為什么呢瑰妄?因?yàn)樵谧鲛D(zhuǎn)換時(shí)陷嘴,隱含了一個(gè)假設(shè),我們想當(dāng)然地認(rèn)為這個(gè)假設(shè)是成立的间坐,實(shí)際上它并不總是成立灾挨。這個(gè)假設(shè)就是第一個(gè)視頻幀和第一個(gè)音頻幀的時(shí)間戳應(yīng)該對(duì)應(yīng)到同一個(gè)點(diǎn)上,即無(wú)論它們時(shí)間戳是多少竹宋,都應(yīng)該在同一時(shí)間播放劳澄。
僅僅使用RTP時(shí)間戳是無(wú)法實(shí)現(xiàn)媒體間同步的,根本的原因是音頻時(shí)間軸和視頻時(shí)間軸是完全獨(dú)立的逝撬,通過(guò)音頻幀和視頻幀的時(shí)間戳浴骂,無(wú)法確定一個(gè)視頻幀和一個(gè)音頻幀的相對(duì)時(shí)間關(guān)系,也就是無(wú)法把它們都準(zhǔn)確定位在絕對(duì)時(shí)間軸上宪潮,只能準(zhǔn)確定位一個(gè)。
要實(shí)現(xiàn)RTP媒體間同步趣苏,需要借助于RTCP狡相,在RTCP的SR包中,包含有<NTP時(shí)間食磕,RTP時(shí)間戳>對(duì)尽棕,音頻幀RTP時(shí)間戳和視頻幀RTP時(shí)間戳通過(guò)<NTP時(shí)間,RTP時(shí)間戳>對(duì)彬伦,都可以準(zhǔn)確定位到絕對(duì)時(shí)間軸NTP上滔悉,音頻幀和視頻幀的相對(duì)時(shí)間關(guān)系就可以確定下來(lái)了伊诵。
上面提到,我們的那個(gè)隱含的假設(shè)并不總是成立回官,那就是說(shuō)它有成立的時(shí)候曹宴。那是不是說(shuō)當(dāng)它成立時(shí),我們就可以不用RTCP來(lái)做媒體間同步了歉提?答案是笛坦,基本上可以這么認(rèn)為。
例如苔巨,對(duì)于RTP實(shí)時(shí)流版扩,在發(fā)送端媒體間就同步的很好,在接收端只需做少許處理侄泽,不需要RTCP礁芦,就可以實(shí)現(xiàn)媒體間同步。當(dāng)然悼尾,這只是少數(shù)例外柿扣。因?yàn)镽TP規(guī)范并不包括這個(gè)假設(shè),所以我們還是按照RTP規(guī)范來(lái)做吧诀豁。
下面說(shuō)一下DirectShow和MPEG2-TS的時(shí)間戳窄刘。DirectShow中的時(shí)間戳和RTP中的時(shí)間戳,除了單位不一樣舷胜,計(jì)算方法不一樣外娩践,本質(zhì)的區(qū)別就是DirectShow中的音頻幀和視頻幀時(shí)間戳使用的是同一個(gè)時(shí)間軸,所以不需要借助其他的東西烹骨,僅僅使用音頻幀時(shí)間戳和視頻幀時(shí)間戳就可以實(shí)現(xiàn)媒體間同步翻伺。MPEG2-TS流中也有時(shí)間戳,它的時(shí)間戳和RTP及DirectShow的時(shí)間戳都不同沮焕,TS流中的音頻幀和視頻幀時(shí)間戳使用的也是同一個(gè)時(shí)間軸吨岭,TS流中的音頻和視頻是復(fù)用的,這在一定程度上就起到了同步的作用峦树,所以它并不是在每個(gè)幀上都打時(shí)間戳辣辫,比如它的PTS時(shí)間戳就是每隔0.1秒一個(gè),缺失的時(shí)間戳是通過(guò)其他時(shí)間戳插值計(jì)算出來(lái)的魁巩。
(dengzikun)
文章轉(zhuǎn)載自:羅索實(shí)驗(yàn)室 [http://www.rosoo.net/a/201101/10776.html]