video - 相机的pts和dts跳转问题

标签 video camera ffmpeg

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

此外,如果我尝试从两个摄像头捕获流,第一个摄像头只有视频,另一个摄像头有视频和音频,那么第一个摄像头数据包的 pts 和 dts 就可以了。但是另一台摄像机的视频和音频 pts/dts 值非常不同。 av_read_frame 返回 pts/dts 值为 1811924055 的视频数据包,在 flv muxer 中重新缩放为 557003451,音频为 4456027604,重新缩放为 557003451,但这些值必须几乎相等!

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

最佳答案

那里发生了很多事情。坦率地说,我会把它写成一个错误实现的 RTMP 流。但是我可以提出一些可以帮助您前进的观点。第一个 RTMP 始终使用 1kHz 时钟并且可以使用 24 或 32 位时间戳。所以时间戳溢出在 4.6 小时和 49.7 天时很常见。下一个 RTMP 可以指定时间增量,因此它可能会溢出 24 位并让接下来的几帧在返回 0(或者实际上是 0 + 增量)之前超过 16777215。最后 4456027604 超过 32 位。所以 ffmpeg 在你得到它们之前对时间戳做一些事情,或者你的代码中有一个错误。祝你好运!

关于video - 相机的pts和dts跳转问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22398316/

相关文章:

windows - 如何将 FFmpeg 输出通过管道传输到多个 ffplay?

css - 是否可以在 Wordpress 中使 *portrait* <video> 标签响应?

android - SurfaceView 正在交换红色和蓝色的 Google Glass 相机颜色

java - 计算高度图上的高度

javascript - 在nodejs中使用ffmpeg上传时,edge和firefox中的sharedarraybuffer错误但在chrome中没有

hadoop - 使用 hadoop 快速编码我的视频

iphone - iPhone 上的 FFmpeg - 修改视频方向

android - 如何在Android中增加相机的亮度

audio - 防止 libavformat (FFmpeg) 将 "ENCODER"标签添加到输出/帮助剥离标签

ffmpeg - Directshow,将流传递给 ffmpeg 之类的程序