工具/软件:Linux
您好:
我想使用 appsink 保存 h264文件。
我们 的 gstreamer 流水线如下所示:
V4l2src ->VPE -> ducatih264enc -> appsink
这是我编写的代码:
#define width 1280
#define height 720
GstFlowReturn sink_new_sample (GstElement*对象、gpointer USER_DATA)
{
GstSample *样本;
GstBuffer *缓冲区;
GstCaps *caps;
GstStructure *s;
内部宽度、高度;
内部分辨率;
SAMPLE = GST_APP_SINK_PULL_SAMPLE (GST_APP_SINK (对象));
如果(采样= 0)
{
返回 GST_flow_OK;
}
CAP = GST_SAMPLE_GET_CAP (sample);
if (!cap){
printf ("无法获取快照格式\n");
}
S = GST_caps_get_structure (cap、0);
RES = GST_structure_get_int (s、"width"、&width);
RES |= GST_structure_get_int (s、"高度"、&height);
if (!res){
printf ("无法获取快照维度\n");
}
printf ("width =%d、height =%d\n"、width、height);
Buffer = GST_SAMPLE_GET_buffer (sample);
如果(缓冲区=0)
{
返回 GST_flow_OK;
}
GstMapInfo 地图;
IF (GST_buffer_map (buffer、&map、GST_MAP_Read))
{
printf ("=========== 保存 h264 === \n");
静态文件*fp=0;
fp = fopen ("../test.h264"、"WB");
if (fp!= NULL)
{
fwrite (map.data、1、map.size、fp);
//fclose (FP);
}
GST_buffer_unmap (buffer、&map);
}
GST_SAMPLE_UNREF (SAMPLE);
返回 GST_flow_OK;
}
int main (int argc、char * argv[])
{
GstElement *管道,* v4l2src,*过滤器,* VPE,*过滤器1, *ducatih264enc,*queue,*appsink;
GstCaps *caps,*caps1;
静态 GMainLoop *循环;
GST_init (&argc、&argv);
循环= g_main_loop_new (NULL、false);
流水线= GST_F管线_NEW ("流水线");
if (!流水线){
g_printerr ("%d gst_pipel_new error \n"、__line__);
返回-1;
}
v4l2src = gst_elue_factory_make ("v4l2src"、"v4l2src0");
if (!v4l2src){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
filter = gst_el元_factory_make ("capsfilter"、"capsfilter0");
如果(!filter){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
VPE = GST_ELECIN_FACTOR_make ("VPE"、"vpe0");
如果(!VPE){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
filter1 = gst_element_factory_make ("capsfilter"、"capsfilter1");
如果(!filter1){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
ducatih264enc = gst_elue_factory_make ("ducatih264enc、"ducatih264enc0");
if (!ducatih264enc){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
队列= GST_ELECK_factory_make ("队列"、"队列0");
如果(!queue){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
appsink = gst_elue_factory_make ("appsink"、"appsink0");
如果(!appsink){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);
}
GstBus *总线;
总线= GST_PIPRAIN_GET_BUS ((GstPipeline*)管线);
GST_BUS_ADD_WATCH (BUS、(GstBusFunc) BUS_CALLBACK、0);
GST_OBJECT_UNREF (BUS);
G_object_set (G_object (v4l2src)、"device"、"/dev/video1、NULL);
G_object_set (G_object (v4l2src)、"IO-mode"、4、NULL);
cap = gst_caps_new_Simple ("video/x-rain"、
"format"、G_TYPE_string、"YUy2"、
"width"、G_TYPE_INT、width、
"高度"、G_TYPE_INT、高度、
"帧速率"、GST_TYPE_FRATE、60、1、
null);
G_object_set (G_object (filter)、"caps"、caps、NULL);
GST_caps_UNREF (cap);
G_object_set (G_object (VPE)、"num-input-buffers"、8、NULL);
caps1 = gst_caps_new_Simple ("video/x-rain"、
"format"、G_TYPE_string、"NV12"、
"width"、G_TYPE_INT、width、
"高度"、G_TYPE_INT、高度、
"帧速率"、GST_TYPE_FRATE、60、1、
null);
G_object_set (G_object (filter1)、"caps"、caps1、NULL);
GST_CAPS_UNREF (caps1);
//appsink
printf ("====== appsink ==== \n");
GstCaps * sink_caps;
SINK_CAP = GST_caps_new_Simple ("VIDEO/x-RAW"、
"format"、G_TYPE_string、"NV12"、
"宽度"、G_TYPE_INT、宽度、
"高度"、G_TYPE_INT、高度、
"帧速率"、GST_TYPE_FRATE、60、1、
null);
G_object_set (appsink、"发射信号"、true、"caps"、sink_caps、"SYNC"、 false、NULL);
G_signal_connect (appsink、"new-sample"、G_callback (sink_new_sample)、NULL);
gst_bin_add_many (gst_bin (pipeline)、v4l2src、filter、vpe、filter1、 ducatih264enc、队列、appsink、NULL);
gst_element_link_many (v4l2src、filter、VPE、filter1、ducatih264enc、 队列、appsink、NULL);
GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);
G_MAIN_LOOP_RUN (LOOP);
G_MAIN_LOOP_UNREF (LOOP);
返回0;
}
但我无法收集数据,原因是什么?