工作中,使用了gstreamer和nvidia的DeepStream插件。如何从nvidia插件中获取数据,这个之前吾有博文专门论述。因为这个很少介绍,也不好找。吾当时也是运气好,从别的代码中得到启示,才找到了正确的解决办法。
那么,普通的gstreamer插件如何获取数据呢?比如说,从decoder(包括nvidia decoder插件)中,获取原始的h264数据代码是怎样的?这个很简单,这里分享出来,这样可以在本博客中都能找到,更方便。
当然,这里的结构体的意思,一看就明白,自行更改即可。
/
static int get_probe_h264_data(const GstPadProbeInfo * pProbeInfo, DataBuffer* pBuffer) { GstBuffer *gst_buf = (GstBuffer *) pProbeInfo->data; GstMapInfo map_info; int size = 0; if (gst_buf == NULL || !gst_buffer_map (gst_buf, &map_info, GST_MAP_READ)) { g_print ("gst_buffer_map() error!"); return -1; } size = gst_buffer_get_size( gst_buf ); databuffer_check(pBuffer, size); gst_buffer_extract (gst_buf, 0, pBuffer->data, size); pBuffer->size = size; gst_buffer_unmap (gst_buf, &map_info); return 0; } /** 获取H264数据,并保存。 */ static GstPadProbeReturn callback_osd_sink_pad_buffer_probe_decoder (GstPad * pad, GstPadProbeInfo * probe_info, gpointer u_data) { AiTask *pAiTask = (AiTask *)u_data; get_probe_h264_data(probe_info, &(pAiTask->h264_buffer)); /*GH_LOG_INFO("size=%d, data=[0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X,]", pAiTask->h264_buffer.size, pAiTask->h264_buffer.data[0], pAiTask->h264_buffer.data[1], pAiTask->h264_buffer.data[2], pAiTask->h264_buffer.data[3], pAiTask->h264_buffer.data[4] ); */ fwrite(pAiTask->h264_buffer.data, 1, pAiTask->h264_buffer.size, pAiTask->h264_file); return GST_PAD_PROBE_OK; } int main() { video_decoder = gst_element_factory_make("nvdec_h264", element_name); osd_pad = gst_element_get_static_pad(video_decoder, TEXT_SINK); if (osd_pad) { osd_probe_id = gst_pad_add_probe(osd_pad, GST_PAD_PROBE_TYPE_BUFFER, callback_osd_sink_pad_buffer_probe_decoder, pTask, NULL); } }