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

相机的pts和dts跳转问题

贡俊
2023-03-14

我在我的代码中使用ffmpeg库从摄像机捕获rtsp流并用FLV编写。如果我只从一个摄像机捕获流,而摄像机只有视频流,那么没有任何错误,我得到了第一个带有pts和DTS1698557894的包,其他包的pts和dts慢慢增加。但是如果摄像机有视频和音频流,那么奇怪的事情就会发生。例如,视频数据包pts和dts以1698557894开始并缓慢增加,音频数据包以0开始并缓慢增加,在~50之后,数据包跳到值151004317并缓慢增加。另一种情况是,音频从0开始并缓慢增加,视频从1785662594开始并在~70包后跳到234722并缓慢增加。这种行为不允许flv段muxer写入文件,它只是返回一些EINVAL值。

另外,如果我试图从两个摄像机捕获流,第一个摄像机只有视频,另一个有视频和音频,那么第一个摄像机包的pts和dts是可以的。但是另一个相机的视频和音频PTS/DTS值非常不同。av_read_frame返回PTS/DTS值为1811924055的视频包,在flv muxer中重标为557003451;音频4456027604重标为557003451,但这些值必须几乎相等!

因此,问题是:0)为什么这些跳跃会在捕获开始时发生?是相机的问题还是ffmpeg的问题?1)这种跳跃会在一段时间后发生吗?我应该如何处理?2)为什么相机的视频和音频有如此不同的PTS/DTS值?

共有1个答案

蒋无尘
2023-03-14

那里发生了很多事情。坦率地说,我会把它作为一个错误实现的RTMP流注销。但我可以提出一些观点,可以帮助你前进。首先,RTMP总是使用1kHz时钟,可以使用24或32位时间戳。因此,时间戳溢出在4.6小时和49.7天是常见的。下一个RTMP可以指定时间增量,所以它可以超过24位流,并让下一对帧超过16777215,然后再包装回0(或者实际上是0+delta)。最后4456027604大于32位。因此,ffmpeg在获得时间戳之前对它们做了一些事情,或者代码中有bug。祝你好运!

 类似资料:
  • 我正在用FFProbe测试一个带有H264视频的mp4文件。我正在使用以下命令来获取帧信息。 我得到以下输出。

  • 当从avi转码到mp4(x264)时,我遇到了fps问题。最终问题出在PTS和DTS值上,所以在AV_INTLEAVED_WRITE_FRAME函数之前添加的第12-15行: 看了很多帖子我还是不明白: =1/25和=1/12800。第一个是我设置的,但我不知道为什么和谁设置了12800?我注意到,在第(7)行=1/90000之前,紧接着它变成了1/12800,为什么?当我从avi转码到avi时,

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

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

  • 和标记不一样,相对跳转就如其名一样,相对于被调用的地方。在任何你可用到标记的地方你也都可以相对跳转。相对跳转由数字标定。+1 跳转到下一条指令 (默认的步进),+2 会跳过一条指令也并且从当前指令转到第二条指令,-2 将往后跳两条指令,+10 将会跳过 9 条指令,从当前指令跳到第十条指令。 一条指令就是在安装程序运行时可以被执行的所有命令。MessageBox、Goto、GetDLLVersio