h264parse: broken/invalid 最终类型

h264parse: broken/invalid nal Type

我正在通过串行 link 接收 h264 帧,试图用 gstreamer 播放它们。我将上限设置为 gst_caps_from_string("video/x-h264"),它似乎接受了它们(如果我使用其他上限,例如 application/x-rtp,那么 gstreamer 日志输出会抱怨不兼容的上限)。

更具体地说,我使用了以下元素:appsrc ! h264parse ! rtph264pay,似乎 h264parse 是一个不快乐的人。

当我通过(通过 appsrc)一个长度为 8018 的 byte[] 帧时,我得到以下日志输出:

WARN h264parse gsth264parse.c:1496:gst_h264_parse_handle_frame:<h264parse0> broken/invalid nal Type: 6 SEI, Size: 12 will be dropped
WARN h264parse gsth264parse.c:1496:gst_h264_parse_handle_frame:<h264parse0> broken/invalid nal Type: 6 SEI, Size: 12 will be dropped
WARN h264parse gsth264parse.c:1496:gst_h264_parse_handle_frame:<h264parse0> broken/invalid nal Type: 1 Slice, Size: 7986 will be dropped

请注意这 3 条 WARN 行是如何相似的,前两行大小为 12,最后一行大小为 <my byte[] size> - 32

这在我发送的所有帧中都是一致的:它总是抱怨两次丢弃 12,然后抱怨丢弃我通过的帧的长度负 32。

为什么会这样?是否与我的管道未收到 SPS/PPS 数据有关?我一直在转储帧 (appsrc ! identity dump=true ! ...),但我似乎找不到任何以 00 00 00 01 6700 00 00 01 68 开头的帧,尽管我不确定是否可以创建这些帧警告与否。

来自the source code,此消息来自:

if (!gst_h264_parse_process_nal (h264parse, &nalu)) {
  GST_WARNING_OBJECT (h264parse,
      "broken/invalid nal Type: %d %s, Size: %u will be dropped",
      nalu.type, _nal_name (nalu.type), nalu.size);
  [...]
}

其中 gst_h264_parse_process_nal(),对于 SEI 帧,returns FALSE 当:

case GST_H264_NAL_SEI:
  /* expected state: got-sps */
  if (!GST_H264_PARSE_STATE_VALID (h264parse, GST_H264_PARSE_STATE_GOT_SPS))
    return FALSE;

GST_H264_PARSE_STATE_VALID定义为:

#define GST_H264_PARSE_STATE_VALID(parse, expected_state) \
  (((parse)->state & (expected_state)) == (expected_state))

好像状态没有设置GST_H264_PARSE_STATE_GOT_SPS时会出现这个错误。

综上所述,上述问题中的帧被丢弃是因为此时尚未收到SPS数据。