当前位置: 首页 > news >正文

【GStreamer】基于gst和gtk的简单videoplayer

在ubuntu上做了一个简单的video player的demo,参考了很多其他人的代码,修修改改调试了一下,能够从web端或者本地读取视频,按下play video按钮就可以实现播放/暂停的效果,不过工具栏还没有实现
在这里插入图片描述
编译命令

gcc gst_gtk_videoplayer.c -o gst_gtk_videoplayer $(pkg-config --cflags --libs gstreamer-1.0 gstreamer-video-1.0 gtk+-3.0)

终端输出
请添加图片描述
代码主要使用了gtk的UI设置,以及如何与gst的输出链接起来,gst使用了简单的uridecodebin和glimagesink模块,整体比较简单,放在了download

两个较为重要的地方,一个是按钮的回调,另一个是glimagesink与gtk widget的连接

// 按钮的回调函数
static void on_play_button_clicked(GtkButton *button, gpointer user_data) {
    if (pipeline) {
        // Get the input from the GtkEntry
        const gchar *input = gtk_entry_get_text(GTK_ENTRY(url_entry));

        // Convert the input to a URI
        gchar *uri = file_path_to_uri(input);
        if (!uri) {
            g_printerr("Invalid file path or URL.\n");
            return;
        }

        // Set the URI for the uridecodebin element
        GstElement *src = gst_bin_get_by_name(GST_BIN(pipeline), "source");
        if (src) {
            g_object_set(src, "uri", uri, NULL);
            gst_object_unref(src);
        }

        g_free(uri); // Free the URI string
        
		// 点击开始播放,再点击暂停
        if (play_status == STREAM_PAUSED) {
            gst_element_set_state(pipeline, GST_STATE_PLAYING);
            g_print("Start playing...\n");
            play_status = STREAM_PLAYING;
        } else {
            gst_element_set_state(pipeline, GST_STATE_PAUSED);
            g_print("Paused...\n");
            play_status = STREAM_PAUSED;
        }
    }
}

// 将video_sink和video_widget绑定,解析的视频会输出到gtk window之中
GstElement *video_sink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
if (video_sink) {
    // Ensure the video widget is realized before setting the window handle
    gtk_widget_realize(video_widget);
    gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(video_sink), GDK_WINDOW_XID(gtk_widget_get_window(video_widget)));
    gst_object_unref(video_sink);
}

相关文章:

  • 风虎云龙R87与RH87八卡服务器震撼首发
  • 如何获取BIOS信息
  • 如何解决软件开发中用户参与度低,反馈滞后的问题
  • IIC总线注意事项
  • XML布局文件与常用View组件
  • Linux(ubuntu)环境下部署The Fuck项目的方法(保姆级教程)
  • 永磁同步电机无速度算法--改进滑模观测器SMO(边界层法)
  • 解决JSON乱码问题:一个实用的.NET工具类
  • 1、语言的本质
  • 微服务保护:Sentinel
  • 三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目
  • 3.5 SpringBootWeb案例
  • vue3 使用easyPlayer 遇到 Cannot read properties of undefined (reading ‘_c‘) 解决方案
  • 深入C语言:指针与数组的经典笔试题剖析
  • 探索DeFi世界:用Python开发去中心化金融应用
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例4: 自定义插槽
  • 共享模型之管程(悲观锁)
  • vue2 插值语法中使用可选链运算符(.?)compile异常排查思路
  • Codeforces Round 835 (Div. 4)题解ABCDEFG
  • 【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)
  • 宿迁做网站 宿迁网站建设/在线资源搜索引擎
  • 医疗美容医院网站建设/公关公司一般收费标准
  • 在建设银行网站申请完信用卡吗/家居seo整站优化方案
  • 网站流量100g/软文发布平台与板块
  • 网站建设 增值税发票/东莞网站建设推广公司
  • 网站源码系统/seo是什么岗位