1.mp4->yuv 视频
/**
* @brief xx.mp4 to xx.yuv
* @param *source mp4 file address, example "./source.mp4"
* @param *sink yuv file address, example "./sink.yuv"
* @return bool
*/
bool videoDecode(char *source, char *sink)
{
GstBus *bus;
GMainLoop *loop;
GstElement *pipeline, *et_source, *et_sink, *et_qtdemux, *et_h264parse, *et_omxh264dec;
/* create loop */
loop = g_main_loop_new(NULL, FALSE);
/* create pipe */
pipeline = gst_pipeline_new("video-decode");
/* create source-link element */
et_source = gst_element_factory_make("filesrc", "file-source");
et_sink = gst_element_factory_make("filesink", "file-sink");
/* create decode element */
et_qtdemux = gst_element_factory_make("qtdemux", "work-qtdemux");
et_h264parse = gst_element_factory_make("h264parse", "work-h264parse");
et_omxh264dec = gst_element_factory_make("omxh264dec", "work-omxh264dec");
if(!et_source || !et_sink ||
!et_qtdemux || !et_h264parse || !et_omxh264dec )
{
printf("One element could not be created\n");
return false;
}
/* set source-link file */
g_object_set(G_OBJECT(et_source), "location", source, NULL);
g_object_set(G_OBJECT(et_sink), "location", sink, NULL);
/* get bus */
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch(bus, bus_call, loop);
gst_object_unref(bus);
/* put all elements in a bin */
gst_bin_add_many(GST_BIN(pipeline), et_source, et_qtdemux, et_h264parse, et_omxh264dec, et_sink, NULL);
/* link together - note that we cannot link the parser and
* decoder yet, becuse the parser uses dynamic pads. For that,
* we set a pad-added signal handler. */
gst_element_link(et_source, et_qtdemux);
gst_element_link_many(et_h264parse, et_omxh264dec, et_sink, NULL);
g_signal_connect(et_qtdemux, "pad-added", G_CALLBACK(pad_link_next_pad), et_h264parse);
printf("start videoDecode\n");
/* Now set to playing and iterate. */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
/* clean up nicely */
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
return true;
}
2.yuv->mp4 视频
/**
* @brief xx.yuv to xx.mp4
* @param *source: yuv file address, example "./source.yuv"
* @param *sink: mp4 file address, example "./sink.mp4"
* @return bool
*/
bool videoEncode(char *source, char *sink, int outPutWidth, int outPutHeight, int outPutFramerate, int outPutBitrate)
{
GstBus *bus;
GMainLoop *loop;
GstElement *pipeline, *et_source, *et_sink, *et_videoparse, *et_omxh264enc, *et_queue, *et_h264parse, *et_mp4mux;
/* create loop */
loop = g_main_loop_new(NULL, FALSE);
/* create pipe */
pipeline = gst_pipeline_new("video-encode");
/* create source-link element */
et_source = gst_element_factory_make("filesrc", "file-source");
et_sink = gst_element_factory_make("filesink", "file-sink");
/* create videoparse element */
et_videoparse = gst_element_factory_make("videoparse", "work-videoparse");
/* create encode element */
et_omxh264enc = gst_element_factory_make("omxh264enc", "work-omxh264enc");
et_queue = gst_element_factory_make("queue", "work-queue");
et_h264parse = gst_element_factory_make("h264parse", "work-h264parse");
et_mp4mux = gst_element_factory_make("mp4mux", "work-mp4mux");
if(!et_source || !et_sink ||
!et_videoparse ||
!et_omxh264enc || !et_queue || !et_h264parse || !et_mp4mux)
{
printf("error One element could not be created\n");
return false;
}
/* set source-link file */
g_object_set(G_OBJECT(et_source), "location", source, NULL);
g_object_set(G_OBJECT(et_sink), "location", sink, NULL);
/* set videoparse */
g_object_set(et_videoparse, "format", 23, "width", outPutWidth, "height", outPutHeight, "framerate", outPutFramerate, 1, NULL);// "nv12" = 23,
/* set videoparse todo*/
g_object_set(et_omxh264enc, "target-bitrate", outPutBitrate, NULL);
/* get bus */
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch(bus, bus_call, loop);
gst_object_unref(bus);
/* put all elements in a bin */
gst_bin_add_many(GST_BIN(pipeline), et_source, et_videoparse, et_omxh264enc, et_queue, et_h264parse, et_mp4mux, et_sink, NULL);
/* link element */
gst_element_link_many(et_source, et_videoparse, et_omxh264enc, et_queue, et_h264parse, et_mp4mux, et_sink, NULL);
printf("start to videoEncode\n");
/* Now set to playing and iterate. */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
/* clean up nicely */
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
return true;
}