gpt4 book ai didi

c# - 从 MediaCapture 访问预览帧

转载 作者:行者123 更新时间:2023-11-30 14:28:19 29 4
gpt4 key购买 nike

我想获取显示在我的 CaptureElement xaml 元素中的预览帧。我的 CaptureElementsource 设置为 MediaCapture 对象,我使用 StartPreview() 方法开始显示相机。我想访问正在显示的帧而不将它们保存到 img 或视频文件中。目标是从预览中捕获 10 fps 并将每个帧发送到另一个接受 byte[] 的类。

我尝试使用 CapturePhotoToStorageFileAsync 方法,但这不是一个可行的选择,因为我不想每秒拍摄 10 张实际图像。我也不想使用 ScreenCapture,因为它将捕获的内容存储到视频文件中。理想情况下,我不想在手机上临时存储任何媒体文件。查看msdn后对于 MediaCapture,我注意到有一个名为 GetPreviewFrameAsync() 的方法,但此方法在 Windows Phone 8.1 中不存在。我也偶然发现了这个 example但是我不完全理解它是如何工作的。

非常感谢任何关于如何解决这个问题的建议。

最佳答案

Microsoft github 页面上有一个相关的示例,尽管它们针对的是 Windows 10。您可能有兴趣迁移您的项目以获得此功能。

GetPreviewFrame :此示例将捕获预览帧而不是完整的照片。一旦有了预览框,它就可以编辑其中的像素。

相关部分如下:

private async Task GetPreviewFrameAsSoftwareBitmapAsync()
{
// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

// Create the video frame to request a SoftwareBitmap preview frame
var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);

// Capture the preview frame
using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame))
{
// Collect the resulting frame
SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap;

// Add a simple green filter effect to the SoftwareBitmap
EditPixels(previewFrame);
}
}

private unsafe void EditPixels(SoftwareBitmap bitmap)
{
// Effect is hard-coded to operate on BGRA8 format only
if (bitmap.BitmapPixelFormat == BitmapPixelFormat.Bgra8)
{
// In BGRA8 format, each pixel is defined by 4 bytes
const int BYTES_PER_PIXEL = 4;

using (var buffer = bitmap.LockBuffer(BitmapBufferAccessMode.ReadWrite))
using (var reference = buffer.CreateReference())
{
// Get a pointer to the pixel buffer
byte* data;
uint capacity;
((IMemoryBufferByteAccess)reference).GetBuffer(out data, out capacity);

// Get information about the BitmapBuffer
var desc = buffer.GetPlaneDescription(0);

// Iterate over all pixels
for (uint row = 0; row < desc.Height; row++)
{
for (uint col = 0; col < desc.Width; col++)
{
// Index of the current pixel in the buffer (defined by the next 4 bytes, BGRA8)
var currPixel = desc.StartIndex + desc.Stride * row + BYTES_PER_PIXEL * col;

// Read the current pixel information into b,g,r channels (leave out alpha channel)
var b = data[currPixel + 0]; // Blue
var g = data[currPixel + 1]; // Green
var r = data[currPixel + 2]; // Red

// Boost the green channel, leave the other two untouched
data[currPixel + 0] = b;
data[currPixel + 1] = (byte)Math.Min(g + 80, 255);
data[currPixel + 2] = r;
}
}
}
}
}

并在你的课外声明:

[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}

当然,您的项目必须允许不安全代码才能使所有这些工作正常进行。

仔细查看示例,了解如何获取所有详细信息。或者,要进行演练,您可以观看 camera session来自最近的//build/ session ,其中包括一些相机示例的演练。

关于c# - 从 MediaCapture 访问预览帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947225/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com