摄像头原始数据读取——gstreamer(gst_parse_launch)

摄像头原始数据读取------gstreamer(gst_parse_launch)

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <gst/gst.h>

#ifdef __cplusplus
};
#endif

static gboolean bus_msg_timeout(GstBus *bus) 
{
    GstMessage *bus_msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE,GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

    if (bus_msg != NULL) 
    {
        GError *err;
        gchar *debug_info;

        switch (GST_MESSAGE_TYPE(bus_msg)) 
        {
            case GST_MESSAGE_ERROR:
                gst_message_parse_error(bus_msg, &err, &debug_info);
                g_printerr("Error received from element %s: %s\n",GST_OBJECT_NAME(bus_msg->src), err->message);
                g_printerr("Debugging information: %s\n",debug_info ? debug_info : "none");
                g_clear_error(&err);
                g_free(debug_info);
                break;
            case GST_MESSAGE_EOS:
                g_print("End-Of-Stream reached.\n");
                break;
            case GST_MESSAGE_STATE_CHANGED:
                break;
            default:
                break;
        }
        gst_message_unref(bus_msg);
    }

    return TRUE;
}

int main(int argc, char *argv[]) 
{
    GMainLoop *main_loop;
    GstElement *element_pipeline;
    GstBus *bus_ptr;
    GstMessage *msg;

    // 初始化GStreamer
    gst_init(&argc, &argv);

    // 使用v4l2src作为视频源,videoconvert进行格式转换,autovideosink自动选择视频输出
    element_pipeline = gst_parse_launch("v4l2src device=/dev/video0 ! videoconvert ! autovideosink", NULL);

    // 创建事件循环
    main_loop = g_main_loop_new(NULL, FALSE);

    // 获取总线以监听消息
    bus_ptr = gst_element_get_bus(element_pipeline);

    // 添加一个定时器来检查总线上的消息
    g_timeout_add_seconds(1, (GSourceFunc)bus_msg_timeout, bus_ptr);

    // 开始播放管道
    gst_element_set_state(element_pipeline, GST_STATE_PLAYING);

    // 运行事件循环
    g_main_loop_run(main_loop);

    // 清理
    gst_element_set_state(element_pipeline, GST_STATE_NULL);
    gst_object_unref(bus_ptr);
    gst_object_unref(element_pipeline);
    g_main_loop_unref(main_loop);

    return 0;
}
相关推荐
Huangjin007_39 分钟前
【Linux 系统篇(二十一)】进程(九):进程等待 wait/waitpid、status状态参数
linux·运维·服务器
j7~1 小时前
【C++微服务项目开发脚手架】(接口篇一)gflags + gtest + spdlog 接口学习笔记
c++·学习·gtest·项目开发·spdlog·gflags·c++项目微服务开发脚手架
星期八不上发条1 小时前
智能指针是什么?使用场景,循环引用解决办法,面试回答
开发语言·c++·stl
螺蛳粉 螺蛳粉1 小时前
mysql的备份与恢复
linux·运维·数据库·mysql
ao-weilai1 小时前
Linux网络编程:Socket UDP
linux·服务器·网络·c++
可乐鸡翅yeah_1 小时前
混合内容 Mixed‑Content 安全策略,HLS HTTPS 页面加载 HTTP 资源排错实战
运维·ffmpeg·音视频·媒体·m3u8
爱吃香菜的初学者1 小时前
九.Linux——文件操作
linux
园长的牧歌2 小时前
Ubuntu 打开应用在导航栏没有图标是个齿轮
linux·ubuntu
曦夜日长2 小时前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
Linux 库制作与原理
linux