Raspberry Pi の .netcore 5 で MMALSharp を使用しようとしています。Pi カメラを使用して、ビデオ ストリームを同じものを示す 2 つの画像に分割し、各ストリームに画像オーバーレイを追加したいと考えています。オーバーレイは同じになります。これは、双眼鏡ヘッドセットで使用されます。これまでのところ、カメラ パイプラインは次のようにレイアウトされています。
camera->splitter->renderer1
\_>renderer2
これにより、カメラからのプレビュー ビデオ フィードが、それを表示する 2 つのウィンドウに適切に分割されます。各レンダラーにオーバーレイを追加する方法について悩んでいます。背景が透明な圧縮されていない RGBA 形式の png 画像を使用しています。add_overlay() メソッドを使用してPythonのPiCameraクラスで使用したため、画像は良好であり、期待どおりに機能します。
これまでのところ、2 つのプレビュー ウィンドウを表示するコードは次のとおりです。
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();