簡體   English   中英

GStreamer 1.0在C中將原始編碼編碼為H.264

[英]GStreamer 1.0 encode raw to H.264 in C

我正在使用GStreamer-1.0 版本:1.10.4

我有一個原始視頻文件,我想在C中使用GStreamer使用h.264進行編碼。

我的管道如下所示:

gst-launch-1.0 filesrc location = myVideo.yuv blocksize = 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

我想知道是否有人可以看到我犯的錯誤,或者有人遇到類似的問題。

您沒有檢查任何函數的返回值。 例如,鏈接元素可能會失敗或設置狀態。

在您的情況下,問題是:a)將解碼器鏈接到videoconvert(有時帶有填充板,您需要連接到“添加了填充板”的信號,然后從那里鏈接,檢查GStreamer文檔),b)將隊列鏈接到mp4mux(它有請求墊,您必須使用gst_element_get_request_pad()才能獲得正確的墊)。

或者,您可以使用C語言中的gst_parse_launch()並傳入管道字符串。 它將為您提供與gst-launch-1.0工具創建的管道等效的管道,並且它將在內部完成我上面提到的兩件事,而您不必擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM