bool init(const std::string& filename, int width, int height, int fps) {
if(!gst_is_initialized()) {
gst_init(nullptr, nullptr);
}
pipeline = gst_pipeline_new("video-encoder");
src = gst_element_factory_make("appsrc", "source");
g_object_set(G_OBJECT(src), "caps", gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "BGR", NULL), NULL);
// 在原有代码基础上修改
// videoconvert = gst_element_factory_make("videoconvert", "color-converter");
// gst_bin_add(GST_BIN(pipeline), videoconv);
convert = gst_element_factory_make("nvvidconv", "convert");
encoder = gst_element_factory_make("omxh264enc", "encoder");
parse = gst_element_factory_make("h264parse", "parser");
muxer = gst_element_factory_make("qtmux", "muxer");
sink = gst_element_factory_make("filesink", "sink");
capsfilter = gst_element_factory_make("capsfilter", "capsfilter");
if(!pipeline || !src || !convert || !encoder || !parse || !muxer || !sink)
{
std::cerr << "Failed to create elements" << std::endl;
return false;
}
g_object_set(src, "stream-type", 0, "format", GST_FORMAT_TIME, nullptr);
// 配置appsrc输入能力(匹配OpenCV的BGR格式)
// GstCaps *input_caps = gst_caps_new_simple("video/x-raw",
// "format", G_TYPE_STRING, "BGR",
// "width", G_TYPE_INT, width,
// "height", G_TYPE_INT, height,
// "framerate", GST_TYPE_FRACTION, fps, 1,
// nullptr);
// g_object_set(src,
// "caps", input_caps,
// "format", GST_FORMAT_TIME,
// "block", TRUE,
// nullptr);
// gst_caps_unref(input_caps);
// 配置输出分辨率和格式(NV12适合硬件编码)
auto caps = gst_caps_new_simple("video/x-raw",
"width", G_TYPE_INT, width,
"height", G_TYPE_INT, height,
"framerate", GST_TYPE_FRACTION, fps, 1,
"format", G_TYPE_STRING, "NV12",
nullptr);
g_object_set(src
, "caps", caps,
"format", GST_FORMAT_TIME,
"block", TRUE,
NULL);
// g_object_set(capsfilter, "caps", caps, nullptr);
gst_caps_unref(caps);
// // 输入格式约束(接在appsrc后)
// GstCaps *in_caps = gst_caps_new_simple("video/x-raw",
// "format", G_TYPE_STRING, "NV12", nullptr);
// g_object_set(videoconv, "caps", in_caps, NULL);
// gst_caps_unref(in_caps);
g_object_set(encoder,
"bitrate", 1000,
// "tune", 0x00000004, // zerolatency
nullptr);
g_object_set(sink, "location", filename.c_str(), "sync", FALSE, nullptr);
gst_bin_add_many(GST_BIN(pipeline),
src,convert,encoder, parse,muxer, sink, nullptr);
if(!gst_element_link_many(src,convert,encoder, parse, muxer, sink, nullptr)) {
std::cerr << "Failed to link elements" << std::endl;
return false;
}
// if (convert) {
// // NVIDIA硬件加速路径
// if (!gst_element_link_many(
// src, videoconvert, convert, capsfilter,
// encoder, parse, muxer, sink, nullptr))
// {
// g_printerr("NVIDIA路径连接失败,尝试通用路径\n");
// gst_bin_remove(GST_BIN(*pipeline), convert);
// }
// }
// 通用连接路径
// if (!gst_element_link_many(
// src, videoconvert, capsfilter,
// encoder, parse, muxer, sink, NULL))
// {
// g_printerr("元素连接失败\n");
// return false;
// }
return true;
}
现在出现颜色不正确,分析下问题
最新发布