ts流中怎么加入dts

ts流中如何加入dts
最近在做hls流媒体相关的项目,ts文件是从mp4文件转过来的,转换程序是自己写的没有用ffmpeg,pts的计算用的是0 + increment,dts我设置成了pts。这段视频用版本比较高的vlc播放是正常的,用低版本的vlc或者在ipad上播放时画面不连续而且感觉略有一点回放的意思。所以我感觉原因是ts文件中有b帧,dts不能设置成pts。我用了mp4v2库读取mp4帧,然后再写入ts文件,帧读取的顺序和pts是一致的所以pts比较好计算。想请教大家怎么样计算出dts。
------解决方案--------------------
引用:
Quote: 引用:

dts比pts小,简单点的话,下一帧的dts是上一帧的pts就可以了。
第一帧的dts就用第一帧的pts减掉帧率折算出的单位时间就行了。
所以第一帧的pts最好不要为0

假如有下面这样一个帧序列,他们的pts如下所示,那么dts可以是多少呢?B帧好像是不需要dts的。
帧    I  P  B  B  P
pts   10 11 12 13 14
dts


是的,B帧不需要DTS。10的dts需要计算下,利用视频的帧率求出帧间的间隔,然后用10的pts减掉就行了,不想计算的话,就取一个比10 pts小的值,不要太小就可以了。
           I     P   B   B   P
pts   10    11 12 13 14
dts   计算  10           13
------解决方案--------------------
dts在MP4的stts中可以计算出来
struct TMP4SttsBox tStts = pTrack->m_Mdia.m_Minf.m_Stbl.m_Stts;
int nDtsIndex = 0; 
int nSampleCount = tStts.m_TimeToSampleTable[nDtsIndex].m_nSampleCount;
for (int m = 0; m < (int)Samples.size() && nDtsIndex < (int)tStts.m_TimeToSampleTable.size(); ++m) 
{
if (m >= nSampleCount)
{
nDtsIndex++;
nSampleCount += tStts.m_TimeToSampleTable[nDtsIndex].m_nSampleCount;
}

if (m == 0)
{
Samples[m].m_nTotalDts = tStts.m_TimeToSampleTable[nDtsIndex].m_nSampleDuration;
}
else
{
Samples[m].m_nDts =  Samples[m-1].m_nTotalDts;
Samples[m].m_nTotalDts = Samples[m-1].m_nTotalDts + tStts.m_TimeToSampleTable[nDtsIndex].m_nSampleDuration;
}
}

视频的cts需要根据dts和ctts中的信息计算。音频的cts等于dts。转换到ts中根据1/90000的公式计算即可。