main.cpp 文件解析
](https://i-blog.csdnimg.cn/blog_migrate/bda245df858b1f1b524f64d9b035b933.png)
1. 创建元素前的准备
GStreamer是一个开源的流媒体框架,用于构建音频和视频流应用程序。它提供了一组库和工具,可以通过它们将多个组件(element)组合在一起以构建流媒体应用程序。以下是对几个常见组件的简要解释:
Pipeline:由多个元素组成的流水线。在 GStreamer 中,通过将多个元素连接在一起来构建一个流水线来实现多媒体处理和传输。
Source:产生数据的元素。在流媒体应用中,数据可以来自文件、摄像头、网络等。
Streammux:将多个输入流合并成一个流的元素,例如将多个视频流合并为一个视频流,或将多个音频流合并为一个音频流。
Pgie:深度学习推理的元素,用于执行物体识别或其他任务。PGIE 通常由 NVIDIA 的 DeepStream SDK 提供,可以使用预先训练的模型或者训练自己的模型。
Nvvidconv:将一个视频格式转换为另一个视频格式的元素,例如将 NV12 格式转换为 RGBA 格式。
Nvosd:将数据绘制在视频帧上的元素,例如绘制物体检测的边界框和类别标签。
Nvvidconv_postosd:在 Nvosd 元素之后的视频格式转换器。
Caps:对数据流进行格式化和限制的元素,可以用于定义媒体流的格式,例如图像的大小和颜色空间。
Encoder:将原始数据编码为特定格式的元素,例如将 H.264 数据编码为 H.264 格式或 H.265 格式。
Rtppay:将编码后的数据打包为 RTP 包的元素,用于在网络上传输媒体流。
Sink:接收数据并将其保存到文件、显示器、网络等的元素。
GstBus 是一个监视 GStreamer pipeline 中消息的结构体,包括错误、警告和状态改变等信息。可以使用 gst_pipeline_get_bus() 函数从 pipeline 中获取 GstBus 对象。
bus_watch_id 是监视 bus 消息的标识符,可以使用 gst_bus_add_watch() 函数添加 bus 消息处理器,并返回 bus_watch_id。
GstPad 是一个连接两个 GStreamer 元素之间的数据路径。元素之间可以有多个 pad,通过在 pad 上连接事件传递数据。
osd_sink_pad 是一个 GstPad,它连接 nvosd 元素的 sink pad。在这里,添加了一个探针(probe)用于获取元数据。
GstCaps 用于描述多媒体数据流的媒体类型和格式。可以通过创建一个 GstCaps 对象,然后通过 capsfilter 元素设置 pipeline 中的某些元素的输出格式。
// main函数
int main(int argc, char *argv[])
{
GMainLoop *loop = NULL;
// 创建各种元素
GstElement *pipeline = NULL, *source = NULL, *streammux = NULL, *pgie = NULL, *nvvidconv = NULL,
*nvosd = NULL, *nvvidconv_postosd = NULL, *caps = NULL, *encoder = NULL, *rtppay = NULL, *sink = NULL;
g_print("With tracker\n");
GstBus *bus = NULL;
guint bus_watch_id = 0;
GstPad *osd_sink_pad = NULL;
GstCaps *caps_filter = NULL;
这里-1指的是默认Device不是不用GPU
guint bitrate = 5000000; // 比特率
gchar *codec = "H264"; // 设置编码格式
guint updsink_port_num = 5400; // 设置端口号
guint rtsp_port_num = 8554; // 设置RTSP端口号
gchar *rtsp_path = "/ds-test"; // 设置RTSP路径
int current_device = -1;
cudaGetDevice(¤t_device);
struct cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, current_device);
gst_init 是 GStreamer 库的初始化函数,它负责初始化 GStreamer 库及其插件等各种资源。如果在使用 GStreamer 库之前没有调用 gst_init,可能会导致一些问题,例如无法加载插件、崩溃等等。因此,在使用 GStreamer 库之前,通常需要调用 gst_init 进行初始化。
loop 则是一个 GMainLoop 对象,是 GStreamer 库的主循环。GStreamer 库使用 GMainLoop 来管理事件和消息处理。GStreamer 应用程序可以创建自己的 GMainLoop,但是为了方便,大多数应用程序使用 GStreamer 库提供的默认循环 g_main_loop_new(),并使用 g_main_loop_run() 来启动循环。
/* Check input arguments */
if (argc != 2)
{
g_printerr("OR: %s <H264 filename>\n", argv[0]);
return -1;
}
/* Standard GStreamer initialization */
// 初始化GStreamer
gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
2. 创建元素

gst_pipeline_new(“ds-tracker-pipeline”) 创建了一个管道,并且指定了它的名字为 “ds-tracker-pipeline”。
create_source_bin(0, argv[1]) 创建了一个包含一个 filesrc 元素和一个 decodebin 元素的源管道,用于从视频文件中读取帧数据。
gst_element_factory_make(“nvstreammux”, “stream-muxer”) 创建了一个流复用器元素,用于将多个流合并为一个流,并将多帧图像打包成 batch。
gst_element_factory_make(“nvinfer”, “primary-nvinference-engine”) 创建了一个推理引擎元素,用于执行物体检测或分类等推理任务。
gst_element_factory_make(“nvvideoconvert”, “nvvideo-converter”) 和
gst_element_factory_make(“nvdsosd”, “nv-onscreendisplay”) 创建了用于图像处理的两个元素。
gst_element_factory_make(“nvvideoconvert”, “convertor_postosd”) 创建了一个用于将 NV12 格式转换为 RGBA 格式的元素。
gst_element_factory_make(“capsfilter”, “filter”) 创建了一个用于配置格式、分辨率等属性的元素。
gst_element_factory_make 是 GStreamer 中创建元素的一个常用函数,它接收两个参数,第一个是元素工厂的名称,第二个是元素在管道中的名称。通过元素工厂的名称,函数可以在 GStreamer 中找到对应的工厂函数,进而创建出对应的元素。
文件或者摄像头提供的是NV12的格式,也是deepstream的默认格式, 需要转换成RGBA做后续的图像处理
A(alpha)是透明度
// ==================== 创建元素 ====================
pipeline = gst_pipeline_new("ds-tracker-pipeline"); // 创建管道
source = create_source_bin(0, argv[1]); // 创建source_bin元素, 用于从文件中读取视频流
streammux = gst_element_factory_make("nvstreammux", "stream-muxer"); // 创建流复用器, 用于将多个流合并为一个流 , 以及将多帧画面打包batch
pgie = gst_element_factory_make("nvinfer", "primary-nvinference-engine"); // 创建PGIE元素, 用于执行推理
// nvtracker = gst_element_factory_make("nvtracker", "tracker"); // 创建tracker元素, 用于跟踪识别到的物体
nvvidconv = gst_element_factory_make("nvvideoconvert", "nvvideo-converter"); // 创建nvvidconv元素, 用于将NV12转换为RGBA
nvosd = gst_element_factory_make("nvdsosd", "nv-onscreendisplay"); // 创建nvosd元素, 用于在转换后的RGBA缓冲区上绘制
nvvidconv_postosd = gst_element_factory_make("nvvideoconvert", "convertor_postosd"); // 创建nvvidconv_postosd元素, 用于将NV12转换为RGBA
caps = gst_element_factory_make("capsfilter", "filter"); // 创建caps元素, 用于设置视频格式
剩下的元素补充进来
// 创建编码器
if (g_strcmp0(codec, "H264") == 0

本文详细介绍了GStreamer框架如何用于构建流媒体应用,特别是NVIDIADeepStreamSDK中的元素,如源、流复用器、推理引擎、视频转换器和屏幕显示元素。文章还涉及了元素间的连接、参数设置、元素创建以及如何处理和发布RTSP流。
最低0.47元/天 解锁文章
1166





