I needed to do the following conversion, from YUV to mp4 ,the following is a part of my code:
gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data)
{
GMainLoop *loop = (GMainLoop *) data;
switch (GST_MESSAGE_TYPE (msg))
{
case GST_MESSAGE_EOS:
fprintf(stderr, "End of stream\n");
g_main_loop_quit(loop);
break;
case GST_MESSAGE_ERROR:
{
gchar *debug;
GError *error;
gst_message_parse_error(msg, &error, &debug);
g_free(debug);
g_printerr("Error: %s\n", error->message);
g_error_free(error);
g_main_loop_quit(loop);
break;
}
default:
break;
}
return TRUE;
}
void PushBuffer()
{
GstFlowReturn ret;
GstBuffer *buffer;
int size = FRAMELENYUV;
GstMapInfo info;
buffer = gst_buffer_new_allocate(NULL, size, NULL); //分配空间
gst_buffer_map(buffer, &info, GST_MAP_WRITE);
unsigned char* buf = info.data;
memmove(buf, rawdata, size);
gst_buffer_unmap(buffer, &info);
ret = gst_app_src_push_buffer(GST_APP_SRC(source), buffer);
if(ret < 0)
{
puts("############################\n");
}
else
{
;
}
}
int factory_make()
{
pipeline = gst_pipeline_new("mypipeline");
source = gst_element_factory_make("appsrc", "mysource");
videoparse = gst_element_factory_make("videoparse" , "myvideoparse");
enconder = gst_element_factory_make("omxh264enc", "myencoder");
filter1 = gst_element_factory_make ("capsfilter", "mufilter");
parser = gst_element_factory_make ("h264parse", "myparser");
muxer = gst_element_factory_make ("qtmux","mymuxer");
sink = gst_element_factory_make ("appsink","mysink");
filter2 = gst_element_factory_make ("capsfilter", "mufilter");
filter_caps1 = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING,"I420", "width",G_TYPE_INT,FRAMEWIDTH,"height",G_TYPE_INT,FRAMEHEIGHT,NULL);
filter_caps2 = gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING,"byte-stream", NULL);
if(!pipeline || !source || !videoparse || !enconder || !filter1 || !filter2 ||!parser || !muxer ||!muxer || !filter_caps2 || !filter_caps1)
{
fprintf(stderr, "Could not gst_element_factory_make, terminating\n");
exit(0);
}
char szTemp[64];
g_object_set (G_OBJECT (filter1), "caps", filter_caps1, NULL);
g_object_set (G_OBJECT (filter2), "caps", filter_caps2, NULL);
gst_caps_unref(filter_caps1);
gst_caps_unref(filter_caps2);
g_object_set(G_OBJECT (enconder), "insert-sps-pps", true , NULL);
g_object_set(G_OBJECT (enconder), "profile", "high" , NULL);
g_object_set(G_OBJECT(enconder) , "iframeinterval" , 15 , NULL);
sprintf(szTemp, "%d" , FRAMELENYUV);
g_object_set(G_OBJECT (source), "blocksize", szTemp,NULL);
g_object_set(G_OBJECT(videoparse) , "width" , FRAMEWIDTH , "height" , FRAMEHEIGHT , NULL);
return 0;
}
int pipelinemake()
{
gst_bin_add_many(GST_BIN(pipeline), source, filter1,enconder,filter2,parser,muxer,sink, NULL);
gst_element_link_many(source,filter1 ,enconder, filter2,parser,muxer,sink);
return 0;
}
int watcher_make()
{
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
bus_watch_id = gst_bus_add_watch(bus, bus_call, loop);
gst_object_unref(bus);
return 0;
}
void *GstreamerThdFun(void *)
{
gst_init(NULL, NULL);
loop = g_main_loop_new(NULL, FALSE);
factory_make();
watcher_make();
pipelinemake();
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
//release all
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
g_source_remove (bus_watch_id);
g_main_loop_unref (loop);
}
void *sendThdFun(void*)
{
unsigned long int max_file = 1024*1024*512;
int countnum = 0;
while(1)
{
usleep(1000*5);
GstSample* sample = gst_app_sink_pull_sample(GST_APP_SINK(source));
if(sample != NULL)
{
GstBuffer* buffer = gst_sample_get_buffer (sample);
GstMapInfo map;
gst_buffer_map (buffer, &map, GST_MAP_READ);
//存储文件
if(storage_num>1024*1024*10)
{
fwrite(storage, sizeof(unsigned char), storage_num , fd);
storage_num = 0;
}
else
{
memcpy(storage + storage_num,map.data,map.size);
storage_num += map.size;
}
countnum += map.size;
if(countnum >= max_file)
{
fclose(fd);
countnum = 0;
}
gst_buffer_unmap (buffer, &map);
gst_sample_unref (sample);
}
else
{
printf("******************************\n");
}
}
}
when I run this program,it failed and the error message is :
gst_app_sink_pull_sample:assertion 'GST_IS_APP_SINK(appsink)'falied!