全网首发:DeepStream中,获得视频帧数据的代码

简介: 全网首发:DeepStream中,获得视频帧数据的代码

根据工作安排,最近对gstreamer进行了研究。工作中要求,把播放的视频帧画面拿到,进行一些处理。这东西可是够偏门的,搜索的资料实在太少。经过反复搜索,连蒙带猜,终于解决了。


解决之后觉得自己真的好幸运:


之前对gstreamer/cuda等等一无所知,临时上手。

并没有代码告诉说如何取得视频画面,完全是通过搜索到的一点蛛丝马迹,连蒙带猜找到正确的路子。

自己的反复测试、验证、分析。

一两天的时间解决(21号入职,之前安装、搭建环境折腾了好几天)。


想想自己觉得有点神奇。除了自己勤快,还要真心感恩勤劳的程序员们,感恩观世音菩萨!


要解决这个问题,确实不是一下子能搞定的,因为其中涉及到cuda。


 有三个关键点:


对osd增加一个探头。这个相对容易。

通过gst_buffer_map得到GstMapInfo。这个很难想到。吾怎么想到的?一个是网上搜索,另外是把相应的头文件、结构体仔细研究过。

通过cudaMemcpy将数据抓出来。这个也很难想到,地址拿到了一访问就崩溃,一般认为获取的方法不对、得到的结果不对等等。吾亦是看到有人用类似的cuda进行缩放,才想到这个可能。也很幸运,找到了正确的办法。

为了避免同志们的苦恼,在此共享出来,希望能够给大家带来帮助。

  • 增加一个探头:
GstElement*   sink_pad2 = gst_element_get_static_pad (osd, "sink");
    osd_probe_id = gst_pad_add_probe (sink_pad2, GST_PAD_PROBE_TYPE_BUFFER,  osd_sink_pad_buffer_probe, NULL, NULL);
  • 实现osd_sink_pad_buffer_probe函数:
static GstPadProbeReturn osd_sink_pad_buffer_probe (GstPad * pad, GstPadProbeInfo * probe_info, gpointer u_data)
{
   GstBuffer *gstbuf = (GstBuffer *) probe_info->data;
   GstMapInfo map_info;
   NvBufSurface *nvsurface = NULL;
   if (gstbuf == NULL)
   {
      return NULL;
   }
   //memset(&map_info, 0, sizeof(map_info));
   if (!gst_buffer_map (gstbuf, &map_info, GST_MAP_READ))
   {
     g_print ("gst_buffer_map() error!");
     return NULL;
   }
   nvsurface =  *((NvBufSurface **) map_info.data);
   //nvsurface->width;
   //nvsurface->height;
   nPixcelByteCount = nvsurface->width*nvsurface->height*BYTES_ARGB;
   if (pFrameVideoDataBuffer == NULL)
   {
       pFrameVideoDataBuffer = malloc(nPixcelByteCount);
   }
   //NvBufMemType=2, 即:
   //MEM_CUDA_DEVICE, < Device memory allocated using cudaMalloc
   if (nvsurface->mem_type == MEM_CUDA_DEVICE)
   {
       //不能直接访问,必须复制出来。
       cudaMemcpy(pFrameVideoDataBuffer, nvsurface->buf_data[0], nPixcelByteCount, cudaMemcpyDeviceToHost);
   }
   else
   {
       memcpy(pFrameVideoDataBuffer, nvsurface->buf_data[0], nPixcelByteCount);
   }
   gst_buffer_unmap (gstbuf, &map_info);
   //进行一些处理。
   //free(pFrameVideoDataBuffer);
   return GST_PAD_PROBE_OK;
}


目录
相关文章
|
机器学习/深度学习 编解码 数据可视化
图像恢复SwinIR: Image Restoration Using Swin Transformer
图像恢复SwinIR: Image Restoration Using Swin Transformer
705 2
|
7月前
|
人工智能 Kubernetes 安全
网络安全公司前沿洞察:F5凭何成为网络安全领域的中流砥柱
网络安全公司前沿洞察:F5凭何成为网络安全领域的中流砥柱
168 4
|
12月前
|
人工智能 数据挖掘 数据库
拥抱Data+AI|破解电商7大挑战,DMS+AnalyticDB助力企业智能决策
本文为数据库「拥抱Data+AI」系列连载第1篇,该系列是阿里云瑶池数据库面向各行业Data+AI应用场景,基于真实客户案例&最佳实践,展示Data+AI行业解决方案的连载文章。本篇内容针对电商行业痛点,将深入探讨如何利用数据与AI技术以及数据分析方法论,为电商行业注入新的活力与效能。
拥抱Data+AI|破解电商7大挑战,DMS+AnalyticDB助力企业智能决策
|
缓存 算法 Java
Java 中常见的性能优化
【10月更文挑战第19天】Java 性能优化是一个复杂而又重要的课题,需要我们在实践中不断积累经验,掌握各种优化技巧,并结合具体情况灵活运用。通过持续的优化努力,我们可以让 Java 程序更加高效、稳定地运行,为用户提供更好的使用体验。你在性能优化方面还有哪些独特的见解或经验呢?欢迎与我分享,让我们一起在性能优化的道路上不断探索和进步。
387 60
|
机器学习/深度学习 算法
概率分布深度解析:PMF、PDF和CDF的技术指南
本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
1184 15
概率分布深度解析:PMF、PDF和CDF的技术指南
|
Python
PyCharm中已经有requirements.txt没有提示自动安装
PyCharm中已经有requirements.txt没有提示自动安装
694 0
PyCharm中已经有requirements.txt没有提示自动安装
|
存储 网络协议 Java
为什么王者荣耀、原神等游戏不使用微服务架构?
王者荣耀、原神作为家喻户晓的手游,能够支撑这么多人同时在线,其底层的架构自然令我们好奇,出乎意料的是,它并没有采用目前炙手可热的微服务架构,到底为什么会这样呢?本文结合知乎问答内容:https://www.zhihu.com/question/359630395撰写,本人其实也是个游戏迷,这次也是想深扒一下其底层的架构设计。
|
搜索推荐 区块链 开发者
【python程序打包教程】PyInstaller一键打包Python程序为独立可执行exe文件
【python程序打包教程】PyInstaller一键打包Python程序为独立可执行exe文件
Springboot中配置文件application.yaml的位置
Springboot中配置文件application.yaml的位置
|
消息中间件 分布式计算 Kafka
Rocketmq、Rabbitmq、Kafka、Mongo、Elasticsearch、Logstash、Kibana、Nacos、Skywalking、Seata、Spark、Zookeeper安装
Rocketmq、Rabbitmq、Kafka、Mongo、Elasticsearch、Logstash、Kibana、Nacos、Skywalking、Seata、Spark、Zookeeper安装
508 0
Rocketmq、Rabbitmq、Kafka、Mongo、Elasticsearch、Logstash、Kibana、Nacos、Skywalking、Seata、Spark、Zookeeper安装
下一篇
开通oss服务