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 67
或 00 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数据。
我正在通过串行 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 67
或 00 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数据。