-->

了解在视频帧PTS和DTS(Understanding PTS and DTS in video f

2019-07-04 04:53发布

从AVI转码为MP4(X264),当我有FPS的问题。 最终的问题是在PTS和DTS的值,因此在那里av_interleaved_write_frame功能之前添加的行12-15:

1.  AVFormatContext* outContainer = NULL;
2.  avformat_alloc_output_context2(&outContainer, NULL, "mp4", "c:\\test.mp4";
3.  AVCodec *encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
4.  AVStream *outStream = avformat_new_stream(outContainer, encoder);
5.  // outStream->codec initiation
6.  // ...
7.  avformat_write_header(outContainer, NULL);

8.  // reading and decoding packet
9.  // ...
10. avcodec_encode_video2(outStream->codec, &encodedPacket, decodedFrame, &got_frame)
11. 
12. if (encodedPacket.pts != AV_NOPTS_VALUE)
13.     encodedPacket.pts =  av_rescale_q(encodedPacket.pts, outStream->codec->time_base, outStream->time_base);
14. if (encodedPacket.dts != AV_NOPTS_VALUE)
15.     encodedPacket.dts = av_rescale_q(encodedPacket.dts, outStream->codec->time_base, outStream->time_base);
16. 
17. av_interleaved_write_frame(outContainer, &encodedPacket)

阅读很多帖子后,我还是不明白:

  1. outStream->codec->time_base = 1/25和outStream->time_base =12800分之1。 一日一被我设置,但我想不出为什么,谁设置12800? 我注意到,在该行之前(7) outStream->time_base =九万分之一和后马上就变成12800分之1,为什么呢? 当我从AVI转码到AVI,这意味着改变线(2)〜 avformat_alloc_output_context2(&outContainer, NULL, "avi", "c:\\test.avi";所以前,后线(7) outStream->time_base遗体总是1/25,而不是在MP4外壳喜欢,为什么?
  2. 是什么的那么time_base之间的区别outStream->codecoutStream
  3. 到calc下的PTS av_rescale_q确实:需要2那么time_base,乘以其交叉馏份,然后计算PTS。 为什么它这样做这样? 正如我调试时, encodedPacket.pts具有值1的增量,那么,为什么改变它,如果它确实具有价值?
  4. 在开始的DTS值为-2后重新调整各个它仍然有负数,但尽管这样的视频正常播放! 它不应该是积极的?

Answer 1:

  1. 的那么time_base仅仅是一个测量单元 。 不同的单元可被用来表示相同的时间(大约,如果它们不是精确的倍数)。 在一些情况下,容器格式需要一定的时基和其将被复用器被设置为。 在其他情况下,容器不需要时间基准,但它有一个默认的,你可能要重写。 我不知道具体12800分之1,我知道1/600是MP4规格的特殊值。

  2. 两个时基是的时间编解码器和用于容器的度量单位。 如果使用恒定帧,测量的编解码器单元通常设置到每个帧和下一(即每一帧是所显示的持续时间)之间的间隔,从而使帧的时间是连续的整数。 它没有被设置为1 / FPS,但是,只要点时间都在使用任何单位正确。

  3. 你描述的仅仅是什么人会做转换从一个单位到另一个。 (即:由旧部,通过新的分歧乘)。 在单位时间T a/b可被转化为单位c/dt*(a*d)/(b*c)

  4. DTS的序列可以从任何值开始,有一个DTS 0。在重放的开始没有特别的意义,挂钟时间和起始DTS之间的差被计算,并且所有未来的DTS被转换使用到挂钟。 与DTS视频流= -10,-9,-8,...是完全确定。 连续DTS之间的区别是使用什么,绝对值并不重要。



文章来源: Understanding PTS and DTS in video frames