MediaCapture.StartPreviewToCustomSinkAsync 方法如何工作?
How does MediaCapture.StartPreviewToCustomSinkAsync method work?
为什么 Windows 文档如此缺乏??似乎无法找到此方法应该如何工作的示例 StartPreviewToCustomSinkAsync
我想做的是从视频源获取预览图像(通过 MediaCapture) but can't understand how this method works (especially what the second parameter, IMediaExtension,应该是 be/do)。
你们有没有机会帮我解决这个问题?
GitHub. If you are developing for Windows Phone 8.1 - samples are here
上有很多例子
根据 this 示例记录如下所示:
private StspMediaSinkProxy mediaSink;
mediaSink = new StspMediaSinkProxy();
MediaEncodingProfile encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Qvga);
var mfExtension = await mediaSink.InitializeAsync(encodingProfile.Audio, encodingProfile.Video);
await mediaCapture.StartRecordToCustomSinkAsync(encodingProfile, mfExtension);
所以,您可以从这个例子中了解如何从 MediaEncodingProfile 中获取 IMediaExtension。
您没有 post 任何代码,但制作预览应该类似于我提供的代码
如果您只需要时不时地获取预览帧,Microsoft github 页面上有一个相关的示例,尽管它们的目标是 Windows 10。您可能有兴趣迁移您的项目以获得此功能。
GetPreviewFrame:此示例将捕获预览帧而不是 full-blown 照片。一旦有了预览框,就可以编辑其中的像素。
相关部分如下:
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;
}
}
}
}
}
并在您的 class 之外声明:
[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
当然,您的项目必须允许不安全的代码才能使所有这些正常工作。
仔细查看示例,了解如何获取所有详细信息。或者,要进行演练,您可以观看最近 //build/ 会议的 camera session,其中包括一些相机示例的演练。
或者,如果你绑定到 8.1,你可以查看 Lumia Imaging SDK, which can notify you when there's a new preview frame available.
为什么 Windows 文档如此缺乏??似乎无法找到此方法应该如何工作的示例 StartPreviewToCustomSinkAsync
我想做的是从视频源获取预览图像(通过 MediaCapture) but can't understand how this method works (especially what the second parameter, IMediaExtension,应该是 be/do)。
你们有没有机会帮我解决这个问题?
GitHub. If you are developing for Windows Phone 8.1 - samples are here
上有很多例子
根据 this 示例记录如下所示:
private StspMediaSinkProxy mediaSink;
mediaSink = new StspMediaSinkProxy();
MediaEncodingProfile encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Qvga);
var mfExtension = await mediaSink.InitializeAsync(encodingProfile.Audio, encodingProfile.Video);
await mediaCapture.StartRecordToCustomSinkAsync(encodingProfile, mfExtension);
所以,您可以从这个例子中了解如何从 MediaEncodingProfile 中获取 IMediaExtension。
您没有 post 任何代码,但制作预览应该类似于我提供的代码
如果您只需要时不时地获取预览帧,Microsoft github 页面上有一个相关的示例,尽管它们的目标是 Windows 10。您可能有兴趣迁移您的项目以获得此功能。
GetPreviewFrame:此示例将捕获预览帧而不是 full-blown 照片。一旦有了预览框,就可以编辑其中的像素。
相关部分如下:
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;
}
}
}
}
}
并在您的 class 之外声明:
[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
当然,您的项目必须允许不安全的代码才能使所有这些正常工作。
仔细查看示例,了解如何获取所有详细信息。或者,要进行演练,您可以观看最近 //build/ 会议的 camera session,其中包括一些相机示例的演练。
或者,如果你绑定到 8.1,你可以查看 Lumia Imaging SDK, which can notify you when there's a new preview frame available.