1 问题来源
1.1 Buffer has no PTS
我使用mp4mux或者qtmux的时候,偶尔会出现Buffer has no PTS问题。
PTS(时间戳)是用于标识音视频数据在时间轴上的位置的重要参数,缺少时间戳信息会导致无法确定数据在时间轴上的位置,从而无法正确的封装和处理。
在 GStreamer 中,DTS 表示“解码时间戳”(Decode Time Stamp)。DTS 是一个用于视频和音频数据流的时间戳,表示媒体数据流中每个样本的解码时间。每个样本都与一个时间戳相关联,它表示该样本应该在媒体时钟中播放的时间。
DTS
通常用于同步音视频,因为它可以告诉播放器何时应该将音频或视频样本解码并呈现给用户。在视频中,DTS 表示每一帧视频在解码后应该呈现的时间。在音频中,DTS 表示每个音频样本应该在什么时间播放。通常,媒体解码器会根据 DTS 对媒体样本进行解码,以确保样本在正确的时间播放。
需要注意的是,DTS 不同于 PTS(Presentation Time Stamp),PTS 表示样本应该在播放时呈现的时间
,而 DTS 则表示样本应该在解码时呈现的时间
。PTS 通常用于同步音视频和处理延迟问题。
使用DeepStream过程中,解析海康摄像头rtsp流时
PTS 有时无效
DTS = -1
Duration = -1
1.2 runtime check failed
也有可能是因为我的GStreamer版本的问题。下面这个警告来于英伟达的H264编解码插件(nvv4l2decoder、nvv4l2h264enc)。目前不清楚该警告和PTS关联情况,具体待测试。
(vpf-app:45070): GStreamer-WARNING **: 01:26:03.100: (../subprojects/gstreamer/gst/gstinfo.c:653):gst_debug_log_valist: runtime check failed: (object == NULL || G_IS_OBJECT (object))
(vpf-app:45070): GStreamer-WARNING **: 01:26:03.101: (../subprojects/gstreamer/gst/gstinfo.c:653):gst_debug_log_valist: runtime check failed: (object == NULL || G_IS_OBJECT (object))
(vpf-app:45070): GStreamer-WARNING **: 01:26:03.101: (../subprojects/gstreamer/gst/gstinfo.c:653):gst_debug_log_valist: runtime check failed: (object == NULL || G_IS_OBJECT (object))
(vpf-app:45070): GStreamer-WARNING **: 01:26:03.101: (../subprojects/gstreamer/gst/gstinfo.c:653):gst_debug_log_valist: runtime check failed: (object == NULL || G_IS_OBJECT (object))
因为没有发现具体影响,该插件也不开源,GStreamer源程序中暂时禁用相关函数。
2 网上搜索到的解决方案
2.1 OpenAI提供了几种方案
解决这个问题的方法是在实时流中添加时间戳信息。如果您使用的是GStreamer进行开发,可以使用相应的插件来添加时间戳信息,例如使用"identity"插件或"videotestsrc"插件中的"timestamp-mode"属性添加时间戳信息。另外,您还可以使用"queue2"插件来缓存数据并确保时间戳信息正确传递。
如果您的实时流确实没有时间戳信息,则需要在解码数据之前先添加时间戳信息。具体的方法可能因数据源的不同而有所不同,但一般来说,您可以使用当前系统时间或音视频帧的采样时间作为时间戳信息。
需要注意的是,实时流的处理和封装比较复杂,需要对数据的传输延迟、帧率、码率等因素进行合理的设置和优化,以保证数据的正确解码和封装。
- GStreamer mp4mux gives “Buffer has no PTS” error using custom appsrc 通过预测时间戳(
文中的方法不稳定,元素运行时间与PTS时间存在变化,没有确定关系
)。 - Gstreamer for Android Buffer has no PTS 通过h264parse设定时间戳的推断模式和启用插值的PTS处理。(
好像只有缺失B帧的情况才有用
)。
gst_base_parse_set_infer_ts (GST_BASE_PARSE (bin->codecparse), TRUE);
gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (bin->codecparse), TRUE);
3.,mp4mux和qtmux都会出现Buffer缺失PTS情况,使用Matroska媒体容器未出现(成功
)
-
mp4mux、qtmux 和 matroskamux 都是媒体容器格式的组件,用于将音频和视频数据打包成单个文件。它们的区别如下:
-
mp4mux:用于将音频和视频流打包成 MP4 文件格式。它通常用于在移动设备和流媒体服务中使用。
-
qtmux:用于将音频和视频流打包成 QuickTime 文件格式。它通常用于苹果设备和软件中。
-
matroskamux:用于将音频和视频流打包成 Matroska 文件格式,也称为MKV。它通常用于视频压制和数字储存设备。
-
总的来说,这些组件的主要区别在于它们支持的容器格式不同。而每种容器格式又有其自身的特点和适用场景,需要根据具体的使用需求进行选择。