我正在尝试在 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();