首页 > 解决方案 > h264parse:损坏/无效的最终类型

问题描述

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

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

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

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 行是如何相似的,前两条下降 size 12,最后一条下降 size <my byte[] size> - 32

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

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

标签: gstreamerh.264gstreamer-1.0

解决方案


源代码中,此消息来自:

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 帧,在以下情况下返回 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 数据。


推荐阅读