add: 添加分辨率设置逻辑
This commit is contained in:
@@ -82,8 +82,11 @@ public class HttpVideoStreamService : BackgroundService
|
||||
private HttpListener? _httpListener;
|
||||
private readonly int _serverPort = 8080;
|
||||
private readonly int _frameRate = 30; // 30 FPS
|
||||
private readonly int _frameWidth = 1280;
|
||||
private readonly int _frameHeight = 720;
|
||||
|
||||
// 动态分辨率配置
|
||||
private int _frameWidth = 640; // 默认640x480
|
||||
private int _frameHeight = 480;
|
||||
private readonly object _resolutionLock = new object();
|
||||
|
||||
// 摄像头客户端
|
||||
private Camera? _camera;
|
||||
@@ -439,8 +442,16 @@ public class HttpVideoStreamService : BackgroundService
|
||||
// 获取当前帧
|
||||
var imageData = await GetFPGAImageData();
|
||||
|
||||
// 获取当前分辨率
|
||||
int currentWidth, currentHeight;
|
||||
lock (_resolutionLock)
|
||||
{
|
||||
currentWidth = _frameWidth;
|
||||
currentHeight = _frameHeight;
|
||||
}
|
||||
|
||||
// 直接使用Common.Image.ConvertRGB24ToJpeg进行转换
|
||||
var jpegResult = Common.Image.ConvertRGB24ToJpeg(imageData, _frameWidth, _frameHeight, 80);
|
||||
var jpegResult = Common.Image.ConvertRGB24ToJpeg(imageData, currentWidth, currentHeight, 80);
|
||||
if (!jpegResult.IsSuccessful)
|
||||
{
|
||||
logger.Error("RGB24转JPEG失败: {Error}", jpegResult.Error);
|
||||
@@ -647,6 +658,14 @@ public class HttpVideoStreamService : BackgroundService
|
||||
|
||||
try
|
||||
{
|
||||
// 获取当前分辨率
|
||||
int currentWidth, currentHeight;
|
||||
lock (_resolutionLock)
|
||||
{
|
||||
currentWidth = _frameWidth;
|
||||
currentHeight = _frameHeight;
|
||||
}
|
||||
|
||||
// 从摄像头读取帧数据
|
||||
var readStartTime = DateTime.UtcNow;
|
||||
var result = await currentCamera.ReadFrame();
|
||||
@@ -662,15 +681,15 @@ public class HttpVideoStreamService : BackgroundService
|
||||
var rgb565Data = result.Value;
|
||||
|
||||
// 验证数据长度是否正确
|
||||
if (!Common.Image.ValidateImageDataLength(rgb565Data, _frameWidth, _frameHeight, 2))
|
||||
if (!Common.Image.ValidateImageDataLength(rgb565Data, currentWidth, currentHeight, 2))
|
||||
{
|
||||
logger.Warn("摄像头数据长度不匹配,期望: {Expected}, 实际: {Actual}",
|
||||
_frameWidth * _frameHeight * 2, rgb565Data.Length);
|
||||
currentWidth * currentHeight * 2, rgb565Data.Length);
|
||||
}
|
||||
|
||||
// 将 RGB565 转换为 RGB24
|
||||
var convertStartTime = DateTime.UtcNow;
|
||||
var rgb24Result = Common.Image.ConvertRGB565ToRGB24(rgb565Data, _frameWidth, _frameHeight, isLittleEndian: false);
|
||||
var rgb24Result = Common.Image.ConvertRGB565ToRGB24(rgb565Data, currentWidth, currentHeight, isLittleEndian: false);
|
||||
var convertEndTime = DateTime.UtcNow;
|
||||
var convertTime = (convertEndTime - convertStartTime).TotalMilliseconds;
|
||||
|
||||
@@ -708,8 +727,16 @@ public class HttpVideoStreamService : BackgroundService
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取当前分辨率
|
||||
int currentWidth, currentHeight;
|
||||
lock (_resolutionLock)
|
||||
{
|
||||
currentWidth = _frameWidth;
|
||||
currentHeight = _frameHeight;
|
||||
}
|
||||
|
||||
// 直接使用Common.Image.ConvertRGB24ToJpeg进行转换
|
||||
var jpegResult = Common.Image.ConvertRGB24ToJpeg(frameData, _frameWidth, _frameHeight, 80);
|
||||
var jpegResult = Common.Image.ConvertRGB24ToJpeg(frameData, currentWidth, currentHeight, 80);
|
||||
if (!jpegResult.IsSuccessful)
|
||||
{
|
||||
logger.Error("RGB24转JPEG失败: {Error}", jpegResult.Error);
|
||||
@@ -904,4 +931,102 @@ public class HttpVideoStreamService : BackgroundService
|
||||
|
||||
base.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置视频流分辨率
|
||||
/// </summary>
|
||||
/// <param name="width">宽度</param>
|
||||
/// <param name="height">高度</param>
|
||||
/// <returns>设置结果</returns>
|
||||
public async Task<(bool IsSuccess, string Message)> SetResolutionAsync(int width, int height)
|
||||
{
|
||||
try
|
||||
{
|
||||
logger.Info($"正在设置视频流分辨率为 {width}x{height}");
|
||||
|
||||
// 验证分辨率
|
||||
if (!IsSupportedResolution(width, height))
|
||||
{
|
||||
var message = $"不支持的分辨率: {width}x{height},支持的分辨率: 640x480, 1280x720";
|
||||
logger.Error(message);
|
||||
return (false, message);
|
||||
}
|
||||
|
||||
Camera? currentCamera = null;
|
||||
lock (_cameraLock)
|
||||
{
|
||||
currentCamera = _camera;
|
||||
}
|
||||
|
||||
if (currentCamera == null)
|
||||
{
|
||||
var message = "摄像头未配置,无法设置分辨率";
|
||||
logger.Error(message);
|
||||
return (false, message);
|
||||
}
|
||||
|
||||
// 设置摄像头分辨率
|
||||
var cameraResult = await currentCamera.ChangeResolution(width, height);
|
||||
if (!cameraResult.IsSuccessful)
|
||||
{
|
||||
var message = $"设置摄像头分辨率失败: {cameraResult.Error}";
|
||||
logger.Error(message);
|
||||
return (false, message);
|
||||
}
|
||||
|
||||
// 更新HTTP服务的分辨率配置
|
||||
lock (_resolutionLock)
|
||||
{
|
||||
_frameWidth = width;
|
||||
_frameHeight = height;
|
||||
}
|
||||
|
||||
var successMessage = $"视频流分辨率已成功设置为 {width}x{height}";
|
||||
logger.Info(successMessage);
|
||||
return (true, successMessage);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var message = $"设置分辨率时发生错误: {ex.Message}";
|
||||
logger.Error(ex, message);
|
||||
return (false, message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前分辨率
|
||||
/// </summary>
|
||||
/// <returns>当前分辨率(宽度, 高度)</returns>
|
||||
public (int Width, int Height) GetCurrentResolution()
|
||||
{
|
||||
lock (_resolutionLock)
|
||||
{
|
||||
return (_frameWidth, _frameHeight);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查是否支持该分辨率
|
||||
/// </summary>
|
||||
/// <param name="width">宽度</param>
|
||||
/// <param name="height">高度</param>
|
||||
/// <returns>是否支持</returns>
|
||||
private bool IsSupportedResolution(int width, int height)
|
||||
{
|
||||
var resolution = $"{width}x{height}";
|
||||
return resolution == "640x480" || resolution == "1280x720";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取支持的分辨率列表
|
||||
/// </summary>
|
||||
/// <returns>支持的分辨率列表</returns>
|
||||
public List<(int Width, int Height, string Name)> GetSupportedResolutions()
|
||||
{
|
||||
return new List<(int, int, string)>
|
||||
{
|
||||
(640, 480, "640x480 (VGA)"),
|
||||
(1280, 720, "1280x720 (HD)")
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user