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

gstreamer:通过线程动态切换帧率,用GST_OBJECT_LOCK卡死

本来这不是个问题,切换个帧率,算什么事?可是实际工作中,高通平台切换帧率会卡死,合作人员又不服。于是不得不写了个代码测试

  • 具体代码
#include <gst/gst.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> /* 全局句柄(实际项目建议用结构体封装,避免全局) */ static GstElement *pipeline = NULL; static GstElement *capsfilter = NULL; static gboolean run_thread = TRUE; #define DEFAULT_FORMAT "NV12" #define DEFAULT_WIDTH 1280 #define DEFAULT_HEIGHT 720 #define FPS_COUNT 5 static int fpss[] = {30, 25, 20, 15, 10}; /** * @brief 子线程:动态切换帧率(示例:10fps <-> 30fps 循环切换) */ void* fps_change_thread(void* arg) { int count = 0; sleep(5); while (run_thread) { int new_fps = fpss[count%FPS_COUNT]; printf("fps = %d\n", new_fps); // 1. 构造新的 Caps:video/x-raw,修改帧率 GstCaps* new_caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, DEFAULT_FORMAT, "width", G_TYPE_INT, DEFAULT_WIDTH, "height", G_TYPE_INT, DEFAULT_HEIGHT, "framerate", GST_TYPE_FRACTION, new_fps, 1, NULL); // 2. GStreamer 线程安全:加锁再修改元素属性 //GST_OBJECT_LOCK(capsfilter); g_object_set(capsfilter, "caps", new_caps, NULL); //GST_OBJECT_UNLOCK(capsfilter); gst_caps_unref(new_caps); // 释放 caps sleep(10); count ++; } return NULL; } int main(int argc, char *argv[]) { GstBus *bus; GstMessage *msg; pthread_t thread; // 1. 初始化 GStreamer gst_init(&argc, &argv); // 2. 创建管道与元素 pipeline = gst_pipeline_new("fps-change-pipeline"); GstElement *src = gst_element_factory_make("videotestsrc", "src"); capsfilter = gst_element_factory_make("capsfilter", "capsfilter"); GstElement *sink = gst_element_factory_make("autovideosink", "sink"); if (!pipeline || !src || !capsfilter || !sink) { g_printerr("创建元素失败!\n"); return -1; } // 3. 构建初始 Caps(初始 30fps) GstCaps *init_caps = gst_caps_new_simple( "video/x-raw", "framerate", GST_TYPE_FRACTION, 30, 1, NULL ); g_object_set(capsfilter, "caps", init_caps, NULL); gst_caps_unref(init_caps); // 4. 添加元素到管道并链接 gst_bin_add_many(GST_BIN(pipeline), src, capsfilter, sink, NULL); if (!gst_element_link_many(src, capsfilter, sink, NULL)) { g_printerr("元素链接失败!\n"); gst_object_unref(pipeline); return -1; } // 5. 启动帧率修改子线程 run_thread = TRUE; pthread_create(&thread, NULL, fps_change_thread, NULL); // 6. 启动管道播放 gst_element_set_state(pipeline, GST_STATE_PLAYING); // 7. 监听总线消息(等待退出/错误) bus = gst_element_get_bus(pipeline); msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); // 8. 收尾工作 run_thread = FALSE; pthread_join(thread, NULL); // 停止管道 gst_element_set_state(pipeline, GST_STATE_NULL); // 释放资源 gst_message_unref(msg); gst_object_unref(bus); gst_object_unref(pipeline); return 0; }
  • 编译脚本:
rm fps gcc \ test.cpp \ -o fps \ $(pkg-config --cflags --libs gstreamer-1.0) ./fps
http://www.rkmt.cn/news/1500358.html

相关文章:

  • iOS审核被拒:2.3.1 截图与App实际内容不符——你的应用“照骗”被当场抓包
  • MgF2Wollaston Polarizer设计原理和应用
  • 如何有效控制Mac风扇转速:5个实用技巧让电脑运行更凉爽
  • 2026雅安漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • UI生成前端代码实测:3种方案从React/Vue到鸿蒙ArkUI
  • 超级IPO潮背后:AGI、商业航天与资本的临界点
  • 工业机器人原理及应用 —— 弧焊 项目作
  • AI替代软件工程师?先算算ROI
  • AniShort:一个人就是一支剧组,AI短剧时代的“印钞机“来了!
  • 2026年 尼得科CT变频器/厂家推荐榜单:精准驱动与节能稳定的工业之选 - 品牌发掘
  • 2026东莞搬家公司测评 5大企业精密仪器搬运全场景解析 - 从来都是英雄出少年
  • 天津滨海新区装修口碑榜:品尚艺墅装饰如何领跑塘沽?
  • IPATool深度解析:如何通过命令行逆向工程App Store通信协议
  • 200元内iPad触控笔横评:伯飞一代 vs 西圣Pencil X vs 倍思磁吸版(参数实测对比)
  • 2026榆林漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 库克“谢幕”,苹果AI“起航”?|苹果2026WWDC
  • 国际货运公司常见问题解答(2026最新专家版) - 资讯快报
  • 为什么只谈 Agent 还不够?——一文讲清楚 Agent 和 Harness 到底分别是什么
  • 2026东莞企业AI短视频推流技术评测|算法原理、架构拆解与落地选型指南
  • 数据的加密与解密(23:03)
  • Claude 进入创意软件后,技术团队该先搭哪一层接口
  • PoE+音频一体化接口设计:从电源变压器到XLR卡侬座的完整链路
  • 2026国内拨动开关轻触开关USB插座端子座电位器实力工厂推荐排行榜:利都电子领衔靠谱厂商精选指南 - 变量人生001
  • 2026三明漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 先 HCIA 再升 HCIP,还是直报 HCIP 更省钱?别白花考证钱!
  • 写代码如开挂——构建IT人的超能力技能树
  • 代理记账常见问题解答(2026最新专家版) - 资讯快报
  • 成本降低66%!防护面屏真实客户案例解析 - 资讯纵览
  • 智能客控增长困局解析
  • 2026企业微信SCRM多少钱?完整收费标准+价格对比避坑指南 - 资讯快报