gpt4 book ai didi

video - 了解视频帧中的 PTS 和 DTS

转载 作者:行者123 更新时间:2023-11-28 21:38:37 42 4
gpt4 key购买 nike

我在从 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 = 1/12800。第一个是我设置的,但我不明白为什么以及谁设置了 12800?我注意到在第 (7) 行 outStream->time_base = 1/90000 之前和之后它变为 1/12800,为什么?当我从 avi 转码为 avi 时,这意味着将行 (2) 更改为 avformat_alloc_output_context2(&outContainer, NULL, "avi", "c:\\test.avi"; ,因此行前后 ( 7) outStream->time_base 始终保持 1/25 而不是 mp4 情况,为什么?
  2. outStream->codecoutStream的time_base有什么区别?
  3. 要计算 pts av_rescale_q 会执行以下操作:取 2 个 time_base,将它们的分数交叉相乘,然后计算 pts。为什么这样做呢?在我调试时,encodedPacket.pts 的值增加了 1,那么如果它确实有值,为什么还要更改它呢?
  4. 开始时 dts 值为 -2,每次重新缩放后它仍然为负数,但尽管如此视频仍能正常播放!不应该是积极的吗?

最佳答案

  1. time_base 只是一个单位的测量单位。可以使用不同的单位来表示相同的时间(如果它们不是精确的倍数,则为近似值)。在某些情况下,容器格式需要特定的时间基准,并且它将由 muxer 设置为该时间基准。在其他情况下,容器不需要时间基准,但它有一个您可能必须覆盖的默认值。我不确定具体是 1/12800,我知道 1/600 在 mp4 规范中是一个特殊值。

  2. 这两个时间基准是编解码器和容器的时间测量单位。如果使用常量 fps,则编解码器测量单位通常设置为每一帧与下一帧之间的间隔(每一帧显示的持续时间),因此帧时间是连续的整数。但是,它不必设置为 1/fps,只要使用的任何单位的 pts 时间都是正确的。

  3. 您所描述的只是将一种单位转换为另一种单位所必须做的事情。 (即:乘以旧单位,除以新单位)。以 a/b 为单位的时间 t 可以转换为以 c/d 为单位的 t*(a*d)/(b*c).

  4. dts序列可以从任意值开始,dts 0没有特殊意义。播放开始时,会计算wall clock time和起始dts的差值,之后所有的dts都会转换为wall时钟使用那个。 dts=-10, -9, -8, ... 的视频流是完全可以的。连续的 dts 之间的区别是使用什么,绝对值无关紧要。

关于video - 了解视频帧中的 PTS 和 DTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13595288/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com