1. 程式人生 > >DTS和PTS的解釋

DTS和PTS的解釋

集資料回撥過來,發現並不是

40

毫秒的間隔,而是

50

60

,甚至

100

不等的

時間間隔。

這就給編碼後打時間戳帶來很大的困難。

libav

裡,我們的預設編碼引數都是:

ptAvEncoder->ptAvStreamVideo->codec->time_base.den = s32Fps; 

ptAvEncoder->ptAvStreamVideo->codec->time_base.num = 1; 

這樣在編碼後的時間戳以

1

遞增,只適合於固定幀率。

我們來改一下:

ptAvEncoder->ptAvStreamVideo->codec->time_base.den = s32Fps * 1000; 

ptAvEncoder->ptAvStreamVideo->codec->time_base.num = 1* 1000; 

這樣就把時間戳的

scale

變成了毫秒,就可以以毫秒為單位進行計算了,如下:

tAvPacket.pts = ((s64)u32TimeStamp * (s64)s32Fps); 

u32TimeStamp

是從開始記錄的時間差值,以毫秒為單位;

s32Fps

是幀率。

對於音訊,

mp4

檔案預設是取樣率為

tick

的,時間戳計算為:

tAvPacket.pts = (AvEncoderAudioInSizeGet(hHandle) * ( (s64)(u32TimeStamp)) 

/ (AvEncoderAudioInSizeGet(hHandle) * 1000 / ptAvEncoder->ptAvStreamAudi

o->codec->sample_rate); 

AvEncoderAudioInSizeGet(hHandle) 

每次編碼器需要的

PCM

資料長度。

u32TimeStamp

是從開始記錄的時間差值,以毫秒為單位。

 ptAvEncoder->ptAvStreamAudio->codec->sample_rate PCM

取樣率,

代表一秒的

資料量。

因為乘以了

1000

,所以也化成了毫秒單位。

對於

mp4,

視訊直接用絕對時間,音訊用資料量,對

rtmp

,視訊是毫秒計算,音

頻也換算成毫秒計算