当前位置: 首页 > 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.jsqmd.com/news/988614/

相关文章:

  • 5分钟掌握SRWE:免费窗口分辨率管理神器终极指南
  • 智能物流仓库系统怎么选?2026 WMS选型标准与智能仓储方案对比
  • 已经处在AI时代里,软件工程师将何去何从?
  • 容器云:当应用学会了“打包”自己
  • iOS审核被拒:2.3.1 截图与App实际内容不符——你的应用“照骗”被当场抓包
  • 亚健康系统化康养包含什么?5大核心模块,读懂科学养生逻辑
  • 2026年技术观察:电商数字资产工业化生产的工具范式与选型边界
  • **性价比高的光纤放大器哪家靠谱**
  • MgF2Wollaston Polarizer设计原理和应用
  • 终极视频去重指南:如何用Vidupe智能清理重复视频文件释放硬盘空间
  • 小说推文漫剧可用AI创作工具平台分析
  • SLS采集日志时,使用过滤插件排除指定日志
  • 2024 FIC初赛 (write up)
  • 海参颜色为什么不一样?黑色、青色、灰色哪种好?
  • 无人机飞不远、信号断?高抗干扰数传电台这样选
  • 猫抓浏览器扩展:5步智能媒体资源嗅探与自动化下载完全指南
  • 为什么说买海参不能只看价格?
  • 2026东莞搬家公司红榜测评 办公室搬迁避坑全指南 - 从来都是英雄出少年
  • 河边的无花果(原创 小说)
  • 政企视频会议全都转向私有化?背后原因被私有化视频会议系统EasyDSS说透了
  • 如何有效控制Mac风扇转速:5个实用技巧让电脑运行更凉爽
  • 计算机毕业设计之django基于大数据的用户购物系统
  • 2026雅安漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • UI生成前端代码实测:3种方案从React/Vue到鸿蒙ArkUI
  • 奥比中光Gemini相机Python SDK配置
  • 2026河南高考志愿填报老师推荐榜|川儿老师领衔,从志愿到考研就业全程规划 - 行业深度观察
  • 海参行业的这些坑,99%的人都踩过!
  • 工业机器人原理及应用 —— 弧焊 项目作
  • AI替代软件工程师?先算算ROI
  • NAT 配置实验详解:从原理到真机配置全过程