方法1,和h264parse配合使用。
以前面文章里提到的例子,PIPE为:
appsrc - h264parse - avdec_h264 - videoconvert - jpegenc - multifilesink
avdec_h264一般连接在h264parse后面,用来解码H264数据。
向appsrc里面填充数据,参考前面的文章,直接把H264文件里读出来的数据不断放进去就可以了。
方法2,直接使用。
做点新的尝试,如果我们把中间的h264parse去掉,PIPE变成下面这样:
appsrc - avdec_h264 - videoconvert - jpegenc - multifilesink
这样流程能不能通?这个时候要如何向appsrc填充数据呢?
答案是流程可以通,不过需要自己去做parse的这部分工作,数据为上篇文章提到的,appsrc的流出数据为:
分隔符 + SPS + 分隔符 + PPS + 分隔符 + 帧数据(SPS和PPS帧不需要单独输出)。
我改了代码测试以后发现,直接报错: caps not negotiated(-4)
caps协商失败,需要添加caps。caps可以通过gst-inspect-1.0 avdec_h264命令来查看。
SINK template: 'sink'
Availability: Always
Capabilities:
video/x-h264
alignment: au
stream-format: { (string)avc, (string)byte-stream }
为appsrc设置caps:
g_object_set(G_OBJECT(appsrc), "caps",
gst_caps_new_simple("video/x-h264", "stream-format", G_TYPE_STRING,
"byte-stream", "alignment", G_TYPE_STRING, "au", NULL),
NULL);
尤其需要注意:
1,“stream-format”不能惯性思维写成“format”,否则很容易想不明白问题出在哪(这个困扰了我不少时间)。
2,alignment必须要添加,否则也会caps not negotiated。
Finally it works !