c# - MediaCapture.StartPreviewToCustomSinkAsync 方法如何工作?

标签 c# .net windows-runtime windows-phone-8.1

为什么 Windows 文档如此缺乏??似乎无法找到此方法应该如何工作的示例 StartPreviewToCustomSinkAsync

我想做的是从视频源(通过 MediaCapture )获取预览图像,但无法理解此方法的工作原理(尤其是第二个参数 IMediaExtension 应该是/做的).

你们有没有机会帮我解决这个问题?

最佳答案

如果您只需要时不时地获取预览帧,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 ,其中包括一些相机示例的演练。

或者,如果您绑定(bind)到 8.1,您可以查看 Lumia Imaging SDK , 这可以 notify you when there's a new preview frame available .

关于c# - MediaCapture.StartPreviewToCustomSinkAsync 方法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36600313/

相关文章:

.net - 如何将 DataTrigger 绑定(bind)到资源定义样式的 Child 属性?

c# - 从 FileActivated 文件访问文件夹中的所有文件

sockets - 用于 WinRT 网络合理性的 Berkeley Socket 外观?

c# - 在下载完成或下载 1MB 之前,WinRT DownloadOperation 不会返回任何内容

c# - 来自 EventHandler 的 Console.Writeline

c# - 使用 JWT Token - Asp.net Core Identity 通过 Web API 上的角色声明进行授权

c# - 使用 Async & Await 的 ASP.NET C#5 异步 Web 应用程序

c# - 类型 'IEnumerable<>' 在未引用的程序集中定义

c# - 这些性能数字 : Arrays vs Lists C# 背后的基本原理

.net - .NET 是 "all COM underneath"吗?