GstOverlay搭配GTK/wxWidget实现无填充黑边视频渲染问题求解
问题描述
我将视频流渲染到wxWidget的ImagePanel控件(代码中对应变量为m_renderwindow)中,渲染画面上下存在填充黑边,尝试了多种方法都无法将其去除。调用gst_video_overlay_set_render_rectangle接口后对应区域变为黑屏,无法正常显示视频流。
复现代码
GstState state; GstState pending; GstPad* pad = nullptr; GError* error = NULL; GstElement* source; GstElement* clocktime; GstElement* textoverlay; GstCaps* caps = gst_caps_new_simple("application/x-rtp", "media", G_TYPE_STRING, "video", "payload", G_TYPE_INT, 96, "encoding-name", G_TYPE_STRING, "H264", NULL); (*ptrstats).pipeline = gst_parse_launch("udpsrc name=source !rtph264depay !h264parse !avdec_h264 ! videoconvert !d3dvideosink name=mysink sync=false ", &error); if (!(*ptrstats).pipeline) { outfile << "Load video : ", error->message, "\n"; exit(1); } source = gst_bin_get_by_name(GST_BIN((*ptrstats).pipeline), "source"); g_object_set(G_OBJECT(source), "caps", caps, NULL); g_object_set(G_OBJECT(source), "port", m_port, NULL); pad = gst_element_get_static_pad(source, "src"); gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, (GstPadProbeCallback)buffer_out_cb, ptrstats, NULL); gst_object_unref(pad); #ifdef __WXGTK__ outfile << "__WXGTK__\n"; GstElement* sink = gst_bin_get_by_name((GstBin*)(*ptrstats).pipeline, "mysink"); gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sink), m_xid); #elif defined __WXMSW__ GstElement* sink = gst_bin_get_by_name((GstBin*)(*ptrstats).pipeline, "mysink"); WXWidget hwnd = m_renderWindow->GetHandle(); //gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(sink), 0, 0, 1224, 1024); gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sink), reinterpret_cast<guintptr>(hwnd)); #endif gst_element_set_state((*ptrstats).pipeline, GST_STATE_PLAYING);
解决方案
修改GStreamer管道中d3dvideosink的配置,添加force-aspect-ratio=false参数即可关闭强制宽高比校验,让视频画面自动拉伸填充整个渲染区域,消除上下填充黑边。
内容的提问来源于stack exchange,提问作者Arnaud Tullio
相关产品推荐
相关产品推荐

