我正在通过串行链路接收h264帧,试图用gstreamer播放它们。我将caps设置为gst_caps_from_string("video/x-h264")
,它似乎接受它们(如果我使用其他caps,例如application/x-rtp
,那么gstreamer日志输出就会报告不兼容的caps)。
更具体地说,我使用了以下元素: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
开头的帧,尽管我不确定这是否会产生这些警告。
发布于 2021-11-06 15:02:58
来自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);
[...]
}
其中,对于SEI帧,gst_h264_parse_process_nal()
在以下情况下为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数据。
https://stackoverflow.com/questions/69791655
复制相似问题