學習筆記:RTP/RTCP的音視頻同步原理總結

參考文章::https://blog.csdn.net/lincaig/article/details/81209895 https://www.cnblogs.com/x_wukong/p/5876645.html

https://blog.csdn.net/wxl1986622/article/details/52758022?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

音視頻媒體間同步是多媒體系統服務質量(QoS)研究中的一項重要內容。在網絡上傳輸多媒體數據時,由於終端對數據的處理方式,以及網絡中的延時、抖動,會引起音視頻流的不同步。

同步是多媒體通信的主要特徵,也是其重要研究內容之一,同步與否直接影響多媒體通信的質量。

一般來說,音視頻同步就是視頻同步到音頻。視頻在渲染的時候,每一幀視頻根據與音頻的時間戳對比,來調整立即渲染還是延遲渲染。比如有一個音頻序列,他們的時間戳是A(0, 20, 40, 60,80,100, 120...),視頻序列V(0, 40, 80, 120...)。音畫同步的步驟如下:

1)取一幀音頻A(0),播放。取一幀視頻V(0),視頻幀時間戳與音頻相等,視頻立即渲染。

2)取一幀音頻A(20),播放。取一幀視頻V(40),視頻幀時間戳大於音頻,視頻太早,需要等待。

3)取一幀音頻A(40),播放。取出視頻,還是上面的V(40),視頻幀時間戳與音頻相等(真實場景中不一定完全相等,他們之間差值的絕對值在一個幀間隔時間內也可以認爲是相同的時間戳),視頻立即渲染。

媒體間同步即是要保持音頻流和視頻流之間的時間關係。爲了描述同步,實現相關的控制機制,定義了相應的服務質量參數(QoS)。針對音視頻,採用時間差即偏差來表示。結果表明,如果偏差限制在一定的範圍內,認爲媒體是同步的。當偏移在-90ms(音頻滯後於視頻)到+20ms(音頻超前視頻)之間時,人感覺不到試聽質量的變化,這個區域可以認爲是同步區域;當偏移在-185到+90之外時,音頻和視頻會出現嚴重的不同步現象,此區域認爲是不同步區域。

對於視頻播放器和實時視頻,他們的同步原理如上面描述的一樣,逃不開時間戳的對齊,只是在實現的時候可能有些差異。

   

RTP 的時間戳.

    首先,瞭解幾個基本概念:

    時間戳單位:時間戳計算的單位不是秒之類的單位,而是由採樣頻率所代替的單位,這樣做的目的就是 爲了是時間戳單位更爲精準。比如說一個音頻的採樣頻率爲8000Hz,那麼我們可以把時間戳單位設爲1 / 8000。
    時間戳增量:相鄰兩個RTP包之間的時間差(以時間 戳單位爲基準)。
    採樣頻率:  每秒鐘抽取樣本的次數,例如音頻的採樣率一般爲8000Hz
    幀率:      每秒傳輸或者顯示幀數,例如25f/s

RTP包頭的第2個32Bit即爲RTP包的時間戳,Time Stamp ,佔32位。
    時間戳反映了RTP分組中的數據的第一個字節的採樣時刻。在一次會話開始時的時間戳初值也是隨機選擇的。即使是沒有信號發送時,時間戳的數值也要隨時間不 斷的增加。接收端使用時間戳可準確知道應當在什麼時間還原哪一個數據塊,從而消除傳輸中的抖動。時間戳還可用來使視頻應用中聲音和圖像同步。
    在RTP協議中並沒有規定時間戳的粒度,這取決於有效載荷的類型。因此RTP的時間戳又稱爲媒體時間戳,以強調這種時間戳的粒度取決於信號的類型。例如, 對於8kHz採樣的話音信號,若每隔20ms構成一個數據塊,則一個數據塊中包含有160個樣本(0.02×8000=160)。因此每發送一個RTP分 組,其時間戳的值就增加160。

  首先,時間戳就是一個值,用來反映某個數據塊的產生(採集)時間點的, 後採集的數據塊的時間戳肯定是大於先採集的數據塊的。有了這樣一個時間戳,就可以標記數據塊的先後順序。
    第二,在實時流傳輸中,數據採集後立刻傳遞到RTP 模塊進行發送,那麼,其實,數據塊的採集時間戳就直接作爲RTP包的時間戳。
    第三,如果用RTP來傳輸固定的文件,則這個時間戳 就是讀文件的時間點,依次遞增。這個不再我們當前的討論範圍內,暫時不考慮。
    第四,時間戳的單位採用的是採樣頻率的倒數,例如採 樣頻率爲8000Hz時,時間戳的單位爲1 / 8000 ,在Jrtplib庫中,有設置時間戳單位的函數接口,而ORTP庫中根據負載類型直接給定了時間戳的單位(音頻負載1/8000,視頻負載1 /90000)
    第五,時間戳增量是指兩個RTP包之間的時間間隔, 詳細點說,就是發送第二個RTP包相距發送第一個RTP包時的時間間隔(單位是時間戳單位)。
    如果採樣頻率爲90000Hz,則由上面討論可知,時間戳單位爲1/90000,我們就假設1s鐘被劃分了90000個時間塊,那麼,如果每秒發送25 幀,那麼,每一個幀的發送佔多少個時間塊呢?當然是 90000/25 = 3600。因此,我們根據定義“時間戳增量是發送第二個RTP包相距發送第一個RTP包時的時間間隔”,故時間戳增量應該爲3600。

    多媒體通信同步方法,主要有時間戳同步法、同步標記法、多路複用同步法三種。下面主要討論時間戳同步法,特別是RTP時間戳同步。內容包括RTP媒 體間同步的實現,爲什麼需要RTCP的NTP時間來實現媒體間同步?沒有RTCP,能實現RTP媒體間的同步嗎?

     根據RTP規範,不同的RTP媒體流是分開傳輸的,且使用各自獨立的時間戳進行同步。假設在一次視頻點播中,傳輸兩路RTP媒體流,一路視頻,一 路音頻。根據視頻幀時間戳,可以實現視頻流內同步,這很好理解,通過視頻幀時間戳可以計算出相鄰視頻幀的時間間隔,也就是視頻幀之間的相對時間關係很容易 通過時間戳來確定,按照這個間隔去呈現視頻,就可以獲得較好的效果。同理,音頻流也可以實現自身的同步。 

     僅僅使用RTP時間戳是無法實現媒體間同步的,根本的原因是音頻時間軸和視頻時間軸是完全獨立的,通過音頻幀和視頻幀的時間戳,無法確定一個視頻幀和一個音頻幀的相對時間關係,也就是無法把它們都準確定位在絕對時間軸上,只能準確定位一個。

     

       總結:在採用RTP協議進行媒體控制傳輸時,音頻和視頻作爲不同的會話傳輸出去了,但他們在RTP層沒有直接的關聯。RTP包頭攜帶的時間戳信息的基點(起始時間)可能是任意時間。所以,時間戳的信息只能在同一個音頻或視頻會話內,確定收到的RTP包的時間先後的相對順序;但該時間戳信息無法確定不同媒體會話之間的時間關係。基於此,需要應用層去實現音視頻同步的方案。

    

RTCP控制參數

        由於音視頻流作爲不同的RTP會話傳送,它們在RTP層無直接關聯。儘管由一個數據源發出的不同的流具有不同的同步源標識(SSRC),爲能進行流同步,RTCP要求發送方給接收方傳送一個唯一的標識數據源的規範名(canonical name),應用層藉此關聯音視頻流,以便實現同步。
      RTP/ RTCP中有時間戳(相對和絕對)和序列號等信息,可以利用它實現基於時間戳的多媒體流同步。使用相對時間戳和序列號實現流內同步;使用相對和絕對時間戳的對應關係實現流間同步。獲得相對與絕對時間戳的算法如下:

while ((pack = GetNextPacket()) != NULL)
         {
              if(srcdat->SR_HasInfo() && srcdat->SR_GetRTPTimestamp() != app->mvideortcprtp)  
                   {  
                            app->mvideortcprtp = srcdat->SR_GetRTPTimestamp();
                            app->mvideortcpntp = srcdat->SR_GetNTPTimestamp().GetMSW();
                            srcdat->FlushPackets();  
                   }
                   DeletePacket(pack);
}

 

音視頻流間同步實現
        發送端在發送音視頻數據時,同時也會發送SR包,這樣可以使接收方能夠正確使音視頻同步播放。

       要實現RTP媒體間同步,需要藉助於RTCP,在RTCP的SR包中,包含有<NTP時間,RTP時間戳>對,音頻幀RTP時間戳和視頻幀RTP時間戳通過<NTP時間,RTP時間戳>對,都可以準確定位到絕對時間軸NTP上,音頻幀和視頻幀的相對時間關係就可以確定下來 了。

具體實現方法是在接收方每次接收數據包後,再遍歷一次數據源,獲取所有源端的SS_RTPTime與SS_NTPTime這兩則數據,通過獲取音頻端與視頻端的數據,可以利用下面的公式進行計算。
   表 2.1    變量描述表

  1. 類型  RTP數據     NTP數據    RTP時戳頻率

  2. 音頻 Audio_SRRTPTime Audio_SRNTPTime Audio_Fre

  3. 視頻 Video_SRRTPTime Video_SRNTPTime Video_Fre

      從SR包中可以讀出音頻與視頻的RTP與NTP數據,而需要計算的是時戳頻率,利用下述公式:

  1. Audio_Fre=( AudioSRRTPtime2- AudioSRRTPtime1)/( AudioSRNTPtime2- AudioSRNTPtime1)

  2. Video_Fre=( VideoSRRTPtime2- VideoSRRTPtime1)/( VideoSRNTPtime2- Video SRNTPtime1)

      以AUDIO爲基準,在某個Audio_SRNTP時刻,對應的視頻RTP的時間可以這樣計算出來:

                      Video_RTPTime=Video_SRRTPTime + (Audio_SRNTP-Video_SRNTP)×Video_Fre

對於任何播放時刻,我們都是以Audio作爲主軸,假設AUDIO的播放時間爲PLAY_AUDIO_TIME,視頻的播放時間爲PLAY_VIDEO_TIME,那麼:

(PLAY_VIDEO_TIME-Video_RTPTime)/Video_Fre=PLAY_AUDIO_TIME-AudioSRRTPtime)/Audio_Fre

由以上公式可以看出,當音頻播放時,我們可以算出此時應該播放的視頻的RTP time,如果該視頻的時間滯後後音頻的時間(根據閾值設定),那麼視頻不播放,等待;否則應 立刻播放。

 

 

   
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章