參考時鍾與時間戳處理
1、參考時鍾
用於作為系統的唯一參考,一般以系統啟動時間開始計時,具體數值影響不大,主要是做一個比較和參考作用。
參考時鍾設計時主要保證穩定性,盡量不產生時鍾偏移。
2、時間戳
時間戳有兩種,
1)同步時間戳
之所以稱為同步,其作用是同步多個流之間的操作,如果只有一個流,顯然這個時間戳是沒有意義的。一般通常用於音頻和視頻的同步播放。
對於實時采集的音視頻數據的時間戳可以簡單的使用采集時刻的參考時鍾值。
對於文件素材的音視頻數據的時間戳,第一幀使用參考時鍾,后續按照流時間戳累加就可以了。
對於網絡接收的音視頻數據的時間戳,使用接收時間作為時間戳,后續需要利用流時間戳來同步音視頻。
音視頻的播放時刻應該為時間戳加上各項處理延遲。
2)流時間戳
用於標明音頻或者視頻流的起止時間,主要作用是判斷是否存在流數據丟失。
音視頻流第一幀的流時間戳具體取值關系不大。譬如視頻流第一幀流時間戳為0,幀持續時間40ms;第二幀流時間戳為40,第三幀依次遞加。
在整個處理過程中,流時間戳不改變。對於音視頻采集,可以判定是否出現丟幀現象;對於網絡音視頻流發送過程中,如果接收的流時間戳出現缺口,說明數據流出現丟失現象。不必要的時候可以不打。
時間戳由時間基准和時間戳值組成。
時間基准:對時間單位(s)划分的標准。
例如,1/25表示每秒分為25個單位,每個單位時間間隔包含1個單位。
3001/90000表示每秒分為90000單位,每個單位時間間隔包含3001個單位。
時間戳值:基於時間基准的時間表示,也即多少個單位時間間隔。
1)時間戳的作用是用於精確標記音視頻流的相對位置和持續時間。
2)基於時間基准使用時間戳,而不是直接使用整數值的意義在於,時間戳可以避免不能夠整除的情況。
3)不同的時間基准之間的時間戳轉換存在誤差,應該避免不必要的轉換。
如果的確需要轉換,應該保證轉換后的時間戳不小於轉換前。
4)不同時間基准直接的時間戳比較,應該首先轉換到划分更細的單位上(1/1hns)進行。
5)系統時鍾相當於1/1000的時間戳,音視頻播放同步,實際就是流自身的時間戳與系統時間戳的一個比較。
由於時間戳轉換存在誤差,所以播放同步實際也是存在誤差。所以不要糾結於等號,而是盡量設置一個可容忍的誤差時長。
ffmpeg中時間戳轉換
AVFormatContext->AVPacket ->AVFrame ->AVPacket->AVFormatContext
AVStream AVCodecContext AVStream
解碼過程:由於AVStream與AVCodecContext是AVFormatContext在文件解析過程創建的,因此兩者的time_base應該是一致的。
AVPacket到AVFrame的時間戳值不變。
編碼過程:AVCodecContext的time_base由用戶設置(默認是1/90000),AVStream中的time_base是默認 值1/90000(ffmpeg在write_header會修改以匹配AVCodecContext值),兩者值不一定相等,因此需要進行時間戳值轉 換。