我正在使用GStreamer-1.0 版本:1.10.4
我有一个原始视频文件,我想使用C中的GStreamer使用h.264进行编码。
我的管道如下所示:
gst-launch-1.0 filesrc位置= myVideo.yuv块大小= 2073600! videoparse宽度= 1920高度= 1080!解码器!视频转换! x264enc!排队! mp4mux名称= mux! filesink location = myFile.mp4
当我在终端中执行该管道时,该管道可以正常工作。但是我想使用C-API做到这一点,因此我的源代码如下:
GstElement* pipeline;
GstElement* src;
GstElement* videoparse;
GstElement* decodebin;
GstElement* videoconvert;
GstElement* x264enc;
GstElement* queue;
GstElement* mp4mux;
GstElement* filesink;
pipeline = gst_pipeline_new("pipeline");
src = gst_element_factory_make("filesrc", NULL);
if(!src) {
GST_WARNING("Error in: src");
}
g_object_set(G_OBJECT(src),"location","myVideo.yuv",NULL);
g_object_set(G_OBJECT(src),2073600,NULL);
videoparse = gst_element_factory_make("videoparse", NULL);
if(!videoparse) {
GST_WARNING("Error in: videoparse");
}
g_object_set(G_OBJECT(videoparse),"width",1920,NULL);
g_object_set(G_OBJECT(videoparse),"height",1080,NULL);
decodebin = gst_element_factory_make("decodebin", NULL);
if(!decodebin) {
GST_WARNING("Error in: decodebin");
}
videoconvert = gst_element_factory_make("videoconvert", NULL);
if(!videoconvert) {
GST_WARNING("Error in: videoconvert");
}
x264enc = gst_element_factory_make("x264enc", NULL);
if(!x264enc) {
GST_WARNING("Error in: x264enc");
}
queue = gst_element_factory_make("queue", NULL);
if(!queue) {
GST_WARNING("Error in: queue");
}
mp4mux = gst_element_factory_make("mp4mux", NULL);
if(!mp4mux) {
GST_WARNING("Error in: mp4mux");
}
g_object_set(G_OBJECT(mp4mux),"name","mux",NULL);
filesink = gst_element_factory_make("filesink", NULL);
if(!filesink) {
GST_WARNING("Error in: filesink");
}
g_object_set(G_OBJECT(filesink),"location","myFile.mp4",NULL);
gst_bin_add_many(GST_BIN(pipeline),src,videoparse,decodebin,videoconvert,x264enc,queue,mp4mux,filesink, NULL);
gst_element_link(src, videoparse);
gst_element_link(videoparse, decodebin);
gst_element_link(decodebin, videoconvert);
gst_element_link(videoconvert, x264enc);
gst_element_link(x264enc, queue);
gst_element_link(queue, mp4mux);
gst_element_link(mp4mux, filesink);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
sleep(40);
正如我所说的,终端中的管道运行良好,但是C实现仅创建一个空的mp4文件。而且我不明白为什么。
在可能有用的情况下:原始视频文件的录制也已使用GStreamer完成。用于此的管道是:
gst-launch-1.0 -e v4l2src device = / dev / video0 num-buffers = 300!排队!图片/ jpeg,宽度= 1920,高度= 1080,帧率= 30/1! jpegdec! video / x-raw,format = I420,width = 1920,height = 1080,framerate = 30/1! filesink location = myVideo.yuv
我想知道是否有人可以看到我犯的错误,或者有人遇到类似的问题。
答案 0 :(得分:0)
您没有检查任何函数的返回值。例如,链接元素可能会失败,或设置状态。
在您的情况下,问题是:a)将解码器链接到videoconvert(有时带有填充板,您需要连接到“添加了填充板”的信号并从那里链接,检查GStreamer文档),b)将队列链接到mp4mux(有请求板,您必须使用gst_element_get_request_pad()才能获得正确的板)。
或者,您可以使用C语言中的gst_parse_launch()并传入管道字符串。它将为您提供与gst-launch-1.0工具创建的管道等效的管道,并且它将在内部完成我上面提到的两件事,而您不必担心。