gstreamer - 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 67
or开头的帧00 00 00 01 68
,尽管我不确定这是否会产生这些警告。
解决方案
从源代码中,此消息来自:
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 数据。
推荐阅读
- c++ - 使用 clang 为 arm cortex m4 编译时,我在哪里可以获得标准库头文件?
- azure-devops - Azure Devops - 无法限制库视图权限
- deployment - 使用自定义网络的 gke 集群部署
- c# - 如何在 RSGCng 中加载 CspParams
- javascript - 传递表单值以在 Vue.js 中构建 Rest API url
- python - ImportError:无法导入名称“进程”
- python - 为什么 OpenCV 在浮点数上比 Numpy 快这么多?
- android - 单击图像后,我的图像无法加载到图像视图中
- python - 如何使用 SPARQL 查询 ttl 文件?
- loopbackjs - 如何返回回调的函数返回值