主頁 >  其他 > WebRTC 音視頻同步原理與實作

WebRTC 音視頻同步原理與實作

2021-04-01 19:18:02 其他

所有的基于網路傳輸的音視頻采集播放系統都會存在音視頻同步的問題,作為現代互聯網實時音視頻通信系統的代表,WebRTC 也不例外,本文將對音視頻同步的原理以及 WebRTC 的實作做深入分析,

時間戳 (timestamp)

同步問題就是快慢的問題,就會牽扯到時間跟音視頻流媒體的對應關系,就有了時間戳的概念,

時間戳用來定義媒體負載資料的采樣時刻,從單調線性遞增的時鐘中獲取,時鐘的精度由 RTP 負載資料的采樣頻率決定,音頻和視頻的采樣頻率是不一樣的,一般音頻的采樣頻率有 16KHz、44.1KHz、48KHz 等,而視頻反映在采樣幀率上,一般幀率有 25fps、29.97fps、30fps 等,

習慣上音頻的時間戳的增速就是其采樣率,比如 16KHz 采樣,每 10ms 采集一幀,則下一幀的時間戳,比上一幀的時間戳,從數值上多 16 x10=160,即音頻時間戳增速為 16/ms,而視頻的采樣頻率習慣上是按照 90KHz 來計算的,就是每秒 90K 個時鐘 tick,之所以用 90K 是因為它正好是上面所說的視頻幀率的倍數,所以就采用了 90K,所以視頻幀的時間戳的增長速率就是 90/ms,

時間戳的生成

音頻幀時間戳的生成

WebRTC 的音頻幀的時間戳,從第一個包為 0,開始累加,每一幀增加 = 編碼幀長 (ms) x 采樣率 / 1000,如果采樣率 16KHz,編碼幀長 20ms,則每個音頻幀的時間戳遞增 20 x 16000/1000 = 320,這里只是說的未打包之前的音頻幀的時間戳,而封裝到 RTP 包里面的時候,會將這個音頻幀的時間戳再累加上一個隨機偏移量(建構式里生成),然后作為此 RTP 包的時間戳,發送出去,如下面代碼所示,注意,這個邏輯同樣適用于視頻包,

視頻幀時間戳的生成

WebRTC 的視頻幀,生成機制跟音頻幀完全不同,視頻幀的時間戳來源于系統時鐘,采集完成后至編碼之前的某個時刻(這個傳遞鏈路非常長,不同配置的視頻幀,走不同的邏輯,會有不同的獲取位置),獲取當前系統的時間 timestamp_us_ ,然后算出此系統時間對應的 ntp_time_ms_ ,再根據此 ntp 時間算出原始視頻幀的時間戳 timestamp_rtp_ ,參看下面的代碼,計算邏輯也在 OnFrame 這個函式中,

為什么視頻幀采用了跟音頻幀不同的時間戳計算機制呢?我的理解,一般情況音頻的采集設備的采樣間隔和時鐘精度更加準確,10ms 一幀,每秒是 100 幀,一般不會出現大的抖動,而視頻幀的幀間隔時間較大采集精度,每秒 25 幀的話,就是 40ms 一幀,如果還采用音頻的按照采樣率來遞增的話,可能會出現跟實際時鐘對不齊的情況,所以就直接每取一幀,按照取出時刻的系統時鐘算出一個時間戳,這樣可以再現真實視頻幀跟實際時間的對應關系,

跟上面音頻一樣,在封裝到 RTP 包的時候,會將原始視頻幀的時間戳累加上一個隨機偏移量(此偏移量跟音頻的并不是同一個值),作為此 RTP 包的時間戳發送出去,值得注意的是,這里計算的 NTP 時間戳根本就不會隨著 RTP 資料包一起發送出去,因為 RTP 包的包頭里面沒有 NTP 欄位,即使是擴展欄位里,我們也沒有放這個值,如下面視頻的時間相關的擴展欄位,

音視頻同步核心依據

從上面可以看出,RTP 包里面只包含每個流的獨立的、單調遞增的時間戳資訊,也就是說音頻和視頻兩個時間戳完全是獨立的,沒有關系的,無法只根據這個資訊來進行同步,因為無法對兩個流的時間進行關聯,我們需要一種映射關系,將兩個獨立的時間戳關聯起來,

這個時候 RTCP 包里面的一種發送端報告分組 SR (SenderReport) 包就上場了,詳情請參考 RFC3550,

SR 包的其中一個作用就是來告訴我們每個流的 RTP 包的時間戳和 NTP 時間的對應關系的,靠的就是上邊圖片中標出的 NTP 時間戳和 RTP 時間戳,通過 RFC3550 的描述,我們知道這兩個時間戳對應的是同一個時刻,這個時刻表示此 SR 包生成的時刻,這就是我們對音視頻進行同步的最核心的依據,所有的其它計算都是圍繞這個核心依據來展開的,

SR 包的生成

由上面論述可知,NTP 時間和 RTP 時間戳是同一時刻的不同表示,只是精度和單位不一樣,NTP 時間是絕對時間,以毫秒為單位,而 RTP 時間戳則和媒體的采樣頻率有關,是一個單調遞增數值,生成 SR 包的程序在 RTCPSender::BuildSR(const RtcpContext& ctx) 函式里面,老版本里面有 bug,寫死了采樣率為 8K,新版本已經修復,下面截圖是老版本的代碼:

計算的思路如下

首先,我們要獲取當前時刻(即 SR 包生成時刻)的 NTP 時間,這個直接從傳過來的引數 ctx 中就可以獲得:

其次,我們要計算當前時刻,應該對應的 RTP 的時間戳是多少,根據最后一個發送的 RTP 包的時間戳 last_rtp_timestamp_ 和它的采集時刻的系統時間 last_frame_capture_time_ms_,和當前媒體流的時間戳的每 ms 增長速率 rtp_rate ,以及從 last_frame_capture_time_ms_ 到當前時刻的時間流逝,就可以算出來,注意,last_rtp_timestamp_ 是媒體流的原始時間戳,不是經過隨機偏移的 RTP 包時間戳,所以最后又累加了偏移量 timestamp_offset_ ,其中最后一個發送的 RTP 包的時間資訊是通過下面的函式進行更新的:

音視頻同步的計算

因為同一臺機器上音頻流和視頻流的本地系統時間是一樣的,也就是系統時間對應的 NTP 格式的時間也是一樣的,是在同一個坐標系上的,所以可以把 NTP 時間作為橫軸 X,單位是 ms,而把 RTP 時間戳的值作為縱軸 Y,畫在一起,下圖展示了計算音視頻同步的原理和方法,其實很簡單,就是使用最近的兩個 SR 點,兩點確定一條直線,之后給任意一個 RTP 時間戳,都可以求出對應的 NTP 時間,又因為視頻和音頻的 NTP 時間是在同一基準上的,所以就可以算出兩者的差值,

上圖以音頻的兩個 SR 包為例,確定出了 RTP 和 NTP 對應關系的直線,然后給任意一個 rtp_a,就算出了其對應的 NTP_a,同理也可以求任意視頻包 rtp_v 對應的 NTP_v 的時間點,兩個的差值就是時間差,

下面是 WebRTC 里面計算直線對應的系數 rate 和偏移 offset 的代碼:

在 WebRTC 中計算的是最新收到的音頻 RTP 包和最新收到的視頻 RTP 包的對應的 NTP 時間,作為網路傳輸引入的不同步時長,然后又根據當前音頻和視頻的 JitterBuffer 和播放緩沖區的大小,得到了播放引入的不同步時長,根據兩個不同步時長,得到了最終的音視頻不同步時長,計算程序在 StreamSynchronization::ComputeRelativeDelay() 函式中,之后又經過了 StreamSynchronization::ComputeDelays() 函式對其進行了指數平滑等一系列的處理和判斷,得出最終控制音頻和視頻的最小延時時間,分別通過 syncable_audio_->SetMinimumPlayoutDelay(target_audio_delay_ms)syncable_video_->SetMinimumPlayoutDelay(target_video_delay_ms) 應用到了音視頻的播放緩沖區,

這一系列操作都是由定時器呼叫 RtpStreamsSynchronizer::Process() 函式來處理的,

另外需要注意一下,在知道采樣率的情況下,是可以通過一個 SR 包來計算的,如果沒有 SR 包,是無法進行準確的音視頻同步的

WebRTC 中實作音視頻同步的手段就是 SR 包,核心的依據就是 SR 包中的 NTP 時間和 RTP 時間戳,最后的兩張 NTP 時間-RTP 時間戳 坐標圖如果你能看明白(其實很簡單,就是求解出直線方程來計算 NTP),那么也就真正的理解了 WebRTC 中音視頻同步的原理,如果有什么遺漏或者錯誤,歡迎大家一起交流!

「視頻云技術」你最值得關注的音視頻技術公眾號,每周推送來自阿里云一線的實踐技術文章,在這里與音視頻領域一流工程師交流切磋,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/270780.html

標籤:其他

上一篇:Kilo 使用教程

下一篇:如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七層協議?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more