当前位置: 首页 > 知识库问答 >
问题:

理解视频帧中的PTS和DTS

陆光济
2023-03-14

当从avi转码到mp4(x264)时,我遇到了fps问题。最终问题出在PTS和DTS值上,所以在AV_INTLEAVED_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. 要计算ptsav_rescale_q所做的事情:取2个time_base,将它们的分数交叉相乘,然后计算pts。它为什么这样做?在我调试时,encodedpacket.pts的值增量为1,那么,如果它有值,为什么要更改它呢?
  4. 开始时的dts值是-2,每次重新缩放后它仍然是负数,但尽管如此,视频播放正确!不应该是阳性吗?

共有1个答案

甘明朗
2023-03-14

>

  • 时基只是一个度量单位。不同的单位可以用来表示相同的时间(如果它们不是精确的倍数,则大致如此)。在某些情况下,容器格式需要一个特定的时间基础,它将被Muxer设置为这个时间基础。在其他情况下,容器不需要时间基础,但它有一个您可能必须重写的默认值。我不确定具体的1/12800,我知道1/600是mp4规范中的一个特殊值。

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

    你所描述的只是从一个单位转换到另一个单位所必须做的事情。(乘以旧单位,除以新单位)。以A/b为单位的时间t可以转换为c/dt*(A*d)/(b*c)的单位。

  •  类似资料:
    • 我正在从两个不同的线程接收视频H264编码数据和音频G.711 PCM编码数据,以mux/写入多媒体容器。 writer函数签名如下所示: 提前感谢! 编辑:在我的视频流中,没有B帧。所以,我认为这里PTS和DTS可以保持不变。

    • 我正在尝试mux H264编码数据和G711 PCM数据到多媒体容器。我从编码数据创建,最初视频/音频帧的PTS和DTS值等效于。所以我使用当前时间信息计算了DTS。我的密码- 我添加了这样的流- 编辑: 根据Ronald S.Bultje的建议,我所理解的是: 应该设置为现在音频和视频流现在都在同一时间基本单位中。 另外,如果我想使用视频流时基作为和音频流时基作为,正确的代码应该是什么样子? 编

    • 文件中特定帧的PTS是否可能与流式传输时同一文件中同一帧的PTS不同? 当我使用av_read_frame读取帧时,我将视频流存储在avstream中。在使用avcodec_decode_video2解码帧后,使用av_frame_get_best_effort_timestamp将该帧的时间戳存储在int64_t中。现在,如果程序从一个文件中获取其输入,我会得到一个不同的时间戳,与我将输入(从同

    • 问题内容: 我是OpenCV的初学者。我想对要上传到服务器的视频帧进行一些图像处理。我只想读取可用的框架并将它们写入目录中。然后,等待视频的另一部分上载并将帧写入目录。并且,我应该等待每个帧都完全上传,然后将其写入文件。 您能告诉我如何使用OpenCV(Python)吗? 编辑1: 我编写了这段代码,用于从文件中捕获视频,而新数据将附加在文件末尾。换句话说,该文件不是完整的视频,并且另一个程序正在

    • 下面是我的代码: 所以问题是调用!当没有框架时,它将返回!而且它不会再捕捉帧了,即使我等了很长时间。