根据工作安排,最近对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);
memcpy(pFrameVideoDataBuffer, nvsurface->buf_data[0], nPixcelByteCount);
gst_buffer_unmap (gstbuf, &map_info);
//进行一些处理。
//free(pFrameVideoDataBuffer);
return GST_PAD_PROBE_OK;
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理(3)
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理(1)
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理(2)
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理