全网首发: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;
}
目录
相关文章
|
测试技术 网络安全 数据安全/隐私保护
【Docker项目实战】使用Docker部署Mininote轻量级笔记工具
【4月更文挑战第7天】使用Docker部署Mininote轻量级笔记工具
433 2
|
4月前
|
关系型数据库 MySQL Linux
购买阿里云服务器选择应用镜像和系统镜像区别,哪个好?
在阿里云购买服务器时,选择应用镜像还是系统镜像需根据需求与技术能力决定。应用镜像适合快速部署、无需环境配置的场景,如建站或测试;系统镜像则提供更高灵活性,适合自定义开发和企业级服务。两者各有优劣:应用镜像操作简单但版本可能较旧,系统镜像可控性强但需手动配置。建议新手优先使用应用镜像,技术用户可选系统镜像以优化性能。
|
NoSQL Redis Docker
Docker中Redis数据迁移到本地
Docker中Redis数据迁移到本地
404 1
|
10月前
|
Java Android开发
如何确定抛出`NoSuchFieldError`异常的字段
当Java程序运行时,如果尝试访问一个不存在的字段,就会抛出`NoSuchFieldError`异常。要确定引发此异常的字段,可以通过检查异常堆栈跟踪中的类名和字段名来定位问题所在。此外,确保所使用的类版本一致,避免因类文件不匹配导致的此类错误。
492 8
|
10月前
|
编解码 算法 安全
flv 和 mp4 区别
【10月更文挑战第26天】FLV和MP4格式在容器格式、编码标准、视频质量、兼容性、流媒体支持以及编辑制作等方面都存在一定的区别。用户在选择使用哪种格式时,应根据具体的需求和应用场景来决定。如果注重网络流媒体播放和实时性,FLV格式可能更适合;如果追求更好的视频质量、广泛的兼容性和方便的编辑制作,MP4格式则是更好的选择。
863 10
|
机器学习/深度学习 开发工具 计算机视觉
YOLOv8 目标检测 | 自定义数据集
YOLOv8 目标检测 | 自定义数据集
|
存储 编解码 Android开发
NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888等图像色彩编码格式区别
NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888都是常见的图像颜色编码格式,它们之间的主要区别在于色彩空间和数据排列方式。
328 0
|
缓存 监控 JavaScript
环境搭建:Vue项目的开发环境和生产环境配置
【4月更文挑战第23天】本文指导Vue开发者配置开发和生产环境,强调了两者目的和特点。开发环境用于编写、测试和调试,侧重快速反馈和调试工具;生产环境注重稳定性、效率和安全性,需进行代码优化、错误处理和日志监控。配置步骤包括安装Node.js和npm,使用Vue CLI,配置Webpack、热重载和源码映射。生产环境要实现代码分割、压缩、最小化,启用CSP、HTTPS,优化静态资源和缓存策略。环境配置应随项目发展和技术进步持续优化。
1216 0
|
Java 数据库连接 数据库
Mybatis-Pagehelper详细解析及优化插件开发
项目数据库数据量较大,分页查询要很久,所以要对分页优化,项目使用的分页是mybatis的Pagehelper,于是在Pagehelper的基础上进行了本次分页查询的优化
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题
OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题
584 0
OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题