Место общения программистов C#
Anonymous
Unity получает SDL и собирает необработанные данные RGB.
Сообщение
Anonymous » 10 янв 2025, 05:55
При повторной разработке с Unity я столкнулся с проблемой. Мне нужно было собрать видеопотоки с микроскопа, и я использовал библиотеку SDL для получения данныхframeData. Однако я не знал, как анализировать данные видеопотока в FrameData, чтобы создавать видео, которые можно было бы использовать в Unity.
открытый класс CameraStreamManager : MonoBehaviour
{
Код: Выделить всё
private Thread cameraThread;
private bool isRunning = false;
private SLcamNet.NetCamera _camera;
private Texture2D videoTexture;
public RawImage videoImage;
private List _infos;
private CameraInfo _cameraInfo;
private SDLPanel sdlPanel;
private Task _task;
private int width = 1920;
private int height = 1080;
private bool frameReady = false;
public void InitializeCamera()
{
SLcamNet.NetCamera.InitNet();
_infos = SLcamNet.NetCamera.SearchAvailableCameras();
if (_infos.Count < 1)
{
Thread.Sleep(100);
_infos = SLcamNet.NetCamera.SearchAvailableCameras();
}
}
public void OpenCamera()
{
sdlPanel?.Dispose();
sdlPanel = new SDLPanel
{
Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right
};
Debug.LogError("_infos>>>> " + _infos.Count);
if (_infos.Count < 1)
{
Thread.Sleep(100);
_infos = SLcamNet.NetCamera.SearchAvailableCameras();
return;
}
CameraSettings settings = new CameraSettings
{
netInfo = _infos[0],
resolution = new CameraResolution(1920, 1080),
streamFormat = StreamFormat.kMJPEG,
pixFormat = PixFormat.kRGBA8888,
rcMode = "cbr",
quality = "high",
frameRate = 25,
bitrate = 86000,
keyFrameInterval = 90
};
settings.netInfo.Username = "admin";
settings.netInfo.Password = "123456";
_camera = SLcamNet.NetCamera.Create(settings.netInfo.Model);
_camera.SetCameraSettings(settings);
_camera.Login();
_cameraInfo = _camera.GetNetCameraAllInfo();
_camera.Open();
isRunning = true;
_task = Task.Run(() => StartCameraCapture());
}
private void StartCameraCapture()
{
Task.Run(() =>
{
Thread.Sleep(500);
IntPtr frameDataPtr = IntPtr.Zero;
while (isRunning)
{
try
{
if (!_camera.GetVideoFrameData(ref frameDataPtr))
continue;
SLcamNet.l_md_data_t frameData = SLcamNet.l_md_data_t.FromIntPtr(frameDataPtr);
Debug.LogError("frameData>>>>>" + frameData.p_rgb);
}
catch (Exception ex)
{
Debug.LogError($"Error in StartCameraCapture: {ex.Message}");
}
}
});
}
private void OnApplicationQuit()
{
isRunning = false;
_task = null;
if (sdlPanel != null)
{
sdlPanel.Dispose(true);
sdlPanel = null;
}
_camera?.Close();
}
Подробнее здесь:
https://stackoverflow.com/questions/793 ... b-raw-data
1736477737
Anonymous
При повторной разработке с Unity я столкнулся с проблемой. Мне нужно было собрать видеопотоки с микроскопа, и я использовал библиотеку SDL для получения данныхframeData. Однако я не знал, как анализировать данные видеопотока в FrameData, чтобы создавать видео, которые можно было бы использовать в Unity. открытый класс CameraStreamManager : MonoBehaviour {[code]private Thread cameraThread; private bool isRunning = false; private SLcamNet.NetCamera _camera; private Texture2D videoTexture; public RawImage videoImage; private List _infos; private CameraInfo _cameraInfo; private SDLPanel sdlPanel; private Task _task; private int width = 1920; private int height = 1080; private bool frameReady = false; public void InitializeCamera() { SLcamNet.NetCamera.InitNet(); _infos = SLcamNet.NetCamera.SearchAvailableCameras(); if (_infos.Count < 1) { Thread.Sleep(100); _infos = SLcamNet.NetCamera.SearchAvailableCameras(); } } public void OpenCamera() { sdlPanel?.Dispose(); sdlPanel = new SDLPanel { Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right }; Debug.LogError("_infos>>>> " + _infos.Count); if (_infos.Count < 1) { Thread.Sleep(100); _infos = SLcamNet.NetCamera.SearchAvailableCameras(); return; } CameraSettings settings = new CameraSettings { netInfo = _infos[0], resolution = new CameraResolution(1920, 1080), streamFormat = StreamFormat.kMJPEG, pixFormat = PixFormat.kRGBA8888, rcMode = "cbr", quality = "high", frameRate = 25, bitrate = 86000, keyFrameInterval = 90 }; settings.netInfo.Username = "admin"; settings.netInfo.Password = "123456"; _camera = SLcamNet.NetCamera.Create(settings.netInfo.Model); _camera.SetCameraSettings(settings); _camera.Login(); _cameraInfo = _camera.GetNetCameraAllInfo(); _camera.Open(); isRunning = true; _task = Task.Run(() => StartCameraCapture()); } private void StartCameraCapture() { Task.Run(() => { Thread.Sleep(500); IntPtr frameDataPtr = IntPtr.Zero; while (isRunning) { try { if (!_camera.GetVideoFrameData(ref frameDataPtr)) continue; SLcamNet.l_md_data_t frameData = SLcamNet.l_md_data_t.FromIntPtr(frameDataPtr); Debug.LogError("frameData>>>>>" + frameData.p_rgb); } catch (Exception ex) { Debug.LogError($"Error in StartCameraCapture: {ex.Message}"); } } }); } private void OnApplicationQuit() { isRunning = false; _task = null; if (sdlPanel != null) { sdlPanel.Dispose(true); sdlPanel = null; } _camera?.Close(); } [/code] Подробнее здесь: [url]https://stackoverflow.com/questions/79344490/unity-obtains-sdl-and-collects-rgb-raw-data[/url]