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
,視訊是毫秒計算,音
頻也換算成毫秒計算