Commit 6a9eb8d5 by xiongziliang

尝试修复时间戳回环或乱序导致的问题

parent 36803cce
...@@ -107,20 +107,38 @@ void MP4Muxer::onTrackFrame(const Frame::Ptr &frame) { ...@@ -107,20 +107,38 @@ void MP4Muxer::onTrackFrame(const Frame::Ptr &frame) {
if(!track_info.start_dts){ if(!track_info.start_dts){
track_info.start_dts = frame->dts(); track_info.start_dts = frame->dts();
} }
if(!track_info.start_pts){
track_info.start_pts = frame->pts();
}
//相对时间戳 //相对时间戳
int dts_inc = frame->dts() - track_info.start_dts; int64_t dts_inc = frame->dts() - track_info.start_dts;
int pts_inc = frame->pts() - track_info.start_pts; //pts和dts的差值
int pts_dts_diff = frame->pts() - frame->dts();
if(pts_dts_diff > 200 || pts_dts_diff < -200){
//如果差值大于200毫秒,则认为由于回环导致时间戳错乱了
pts_dts_diff = 0;
}
if(dts_inc < track_info.dts_inc){
//本次相对时间戳竟然小于上次?
if(dts_inc < 0){
//时间戳回环,保证下次相对时间戳与本次相对合理增长
track_info.start_dts = frame->dts() - track_info.dts_inc;
//本次时间戳强制等于上次时间戳+10
dts_inc = track_info.dts_inc + 10;
}else{
//时间戳变小了?,那么取上次时间戳+10
dts_inc = track_info.dts_inc + 10;
}
}
//保留上次相对时间戳
track_info.dts_inc = dts_inc;
mov_writer_write_l(_mov_writter.get(), mov_writer_write_l(_mov_writter.get(),
track_info.track_id, track_info.track_id,
frame->data() + frame->prefixSize(), frame->data() + frame->prefixSize(),
frame->size() - frame->prefixSize(), frame->size() - frame->prefixSize(),
pts_inc >= 0 ? pts_inc : 0, pts_dts_diff + dts_inc,
dts_inc >= 0 ? dts_inc : 0, dts_inc,
frame->keyFrame() ? MOV_AV_FLAG_KEYFREAME : 0, frame->keyFrame() ? MOV_AV_FLAG_KEYFREAME : 0,
with_nalu_size); with_nalu_size);
} }
......
...@@ -76,8 +76,8 @@ protected: ...@@ -76,8 +76,8 @@ protected:
private: private:
struct track_info{ struct track_info{
int track_id = -1; int track_id = -1;
uint32_t start_dts = 0; int64_t start_dts = 0;
uint32_t start_pts = 0; int64_t dts_inc = 0;
}; };
map<CodecId,track_info> _codec_to_trackid; map<CodecId,track_info> _codec_to_trackid;
bool _started = false; bool _started = false;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论