0

我正在尝试在 Raspberry Pi 上的 .netcore 5 中使用 MMALSharp。使用 Pi 相机,我想将视频流分成两个显示相同内容的图像,然后为每个流添加一个图像叠加层。叠加层将是相同的。这将与双目耳机一起使用。到目前为止,我的相机管道布局如下:

camera->splitter->renderer1
               \_>renderer2

这会正确地将来自相机的预览视频馈送分成两个显示它的窗口。我对如何为每个渲染器添加叠加层感到困惑。我正在使用具有透明背景的未压缩 RGBA 格式 png 图像。图像很好,因为我在 python 中使用它的 add_overlay() 方法将它与 PiCamera 类一起使用,它按预期工作。

到目前为止,这是我的代码,可用于显示两个预览窗口:

m_Camera = MMALCamera.Instance;
            m_Camera.ConfigureCameraSettings();

            int xOffset = ((config.WindowSettings.DesktopWidth - config.VideoSettings.ResolutionWidth) / 2) 
                - (config.VideoSettings.ResolutionWidth / 2) 
                - (config.WindowSettings.WindowSpacing / 2);

            int yOffset = (config.WindowSettings.DesktopHeight - config.VideoSettings.ResolutionHeight) / 2;

            var configLeft = new PreviewConfiguration
            {
                Layer = 2,
                NoAspect = false,
                FullScreen = false,                
                PreviewWindow = new System.Drawing.Rectangle(
                    xOffset,
                    yOffset,
                    config.VideoSettings.ResolutionWidth,
                    config.VideoSettings.ResolutionHeight),
                DisplayTransform = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYTRANSFORM_T.MMAL_DISPLAY_ROT0,
                DisplayMode = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYMODE_T.MMAL_DISPLAY_MODE_LETTERBOX
            };
            var configRight = new PreviewConfiguration
            {
                Layer = 2,
                NoAspect = false,
                FullScreen = false,                
                PreviewWindow = new System.Drawing.Rectangle(
                    xOffset + config.VideoSettings.ResolutionWidth + config.WindowSettings.WindowSpacing,
                    yOffset, 
                    config.VideoSettings.ResolutionWidth,
                    config.VideoSettings.ResolutionHeight),
                DisplayTransform = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYTRANSFORM_T.MMAL_DISPLAY_ROT0,
                DisplayMode = MMALSharp.Native.MMALParametersVideo.MMAL_DISPLAYMODE_T.MMAL_DISPLAY_MODE_LETTERBOX
            };

            m_Splitter = new MMALSplitterComponent();
            m_LeftRender = new MMALVideoRenderer(configLeft);
            m_LeftRender.ConfigureRenderer();
            m_RightRender = new MMALVideoRenderer(configRight);
            m_RightRender.ConfigureRenderer();
            m_NullSink = new MMALNullSinkComponent();

            m_Camera.Camera.VideoPort.ConnectTo(m_NullSink);
            m_Camera.Camera.PreviewPort.ConnectTo(m_Splitter);
            m_Splitter.Outputs[0].ConnectTo(m_LeftRender);
            m_Splitter.Outputs[1].ConnectTo(m_RightRender);

            m_Splitter.EnableComponent();
            m_LeftRender.EnableComponent();
            m_RightRender.EnableComponent();
            m_NullSink.EnableComponent();

我已经尝试按照 MMALSharp wiki 中关于叠加层的示例进行操作。使用以下代码不起作用并导致分段错误。任何帮助,将不胜感激。

byte[] imageBytes = File.ReadAllBytes(overlayFilePath);
var previewOverlayConfigLeft = new PreviewOverlayConfiguration()
            {
                Layer = 3,
                FullScreen = false,
                PreviewWindow = new System.Drawing.Rectangle(
                    xOffset,
                    yOffset,
                    m_Config.VideoSettings.ResolutionWidth,
                    m_Config.VideoSettings.ResolutionHeight),
                Encoding = MMALSharp.Common.MMALEncoding.RGBA
            };
m_LeftOverlayRenderer = m_Camera.AddOverlay(m_LeftRender, previewOverlayConfigLeft, imageBytes);
            m_LeftOverlayRenderer.ConfigureRenderer();
            m_LeftOverlayRenderer.UpdateOverlay();
4

0 回答 0