- 简单来说,什么是pts和dts值?
- 为什么它们在转码[解码-编码]视频时很重要?
这个代码位在ffmpeg.c中做什么,它的用途是什么?
01562 ist->next_pts = ist->pts = picture.best_effort_timestamp;
01563 if (ist->st->codec->time_base.num != 0) {
01564 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
01565 ist->next_pts += ((int64_t)AV_TIME_BASE *
01566 ist->st->codec->time_base.num * ticks) /
01567 ist->st->codec->time_base.den;
01568 }
字符串
3条答案
按热度按时间swvgeqrz1#
这些是解码时间戳(PTS)和呈现时间戳(PTS)。你可以在这里找到解释inside a tutorial。
假设我们有一部电影,帧显示为:I B B P。现在,我们需要知道P中的信息,然后才能显示任何B帧。因此,帧可能存储如下:I P B B.这就是为什么我们在每一帧上都有一个解码时间戳和一个呈现时间戳。解码时间戳告诉我们什么时候需要解码一些东西,演示时间戳告诉我们什么时候需要显示一些东西。所以,在这种情况下,我们的流可能看起来像这样:
字符串
一般来说,PTS和PTS只在我们播放的流中有B帧时才不同。
vq8itlhq2#
我发现在答案页面中找到信息比链接更清楚。
呈现时间(PTS)是正确的。帧可以乱序存储在文件中,数据可能需要乱序读取或写入才能重建。呈现时间存储与编解码器相关的其他排序。
粘贴的代码片段检索一帧的PTS并计算其持续时间,以便计算下一帧的PTS。
3df52oht3#
B帧是从I帧和P帧预测的。与I帧和P帧相比,B帧通常具有更多的错误,因此不推荐用于预测,尽管它们可能在时间上更接近。存在将B用于预测的算法,但是它来自过去的B帧而不是未来的B帧。
因此,在I P B1 B2的序列中,解码顺序是I P B1 B2,显示顺序是I B1 B2 P。P是从I预测的,B1是从I和P预测的,B2再次是从I和P预测的。