MediaCapture Windows 8桌面应用程序 - 无法使其正常工作

时间:2015-07-12 15:17:12

标签: c# .net windows-8 windows-store-apps webcam

我正在尝试通过此API实现图像捕获,我需要在桌面应用程序中实现。

问题在于,当我将图像保存到文件中时(使用CapturePhotoToStorageFileAsync),我得到一张黑色图片(几乎是黑色),或者我得到零大小的文件。

我的代码非常简单:

MediaCapture = new MediaCapture();
await mediaCapture.InitializeAsync();

Windows.Storage.StorageFile photoStorageFile;
String PHOTO_FILE_NAME = "photo.jpg";
photoStorageFile = await Windows.Storage.KnownFolders.PicturesLibrary.CreateFileAsync(PHOTO_FILE_NAME, Windows.Storage.CreationCollisionOption.GenerateUniqueName);
ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
await mediaCapture.CapturePhotoToStorageFileAsync(imageProperties, photoStorageFile);

我读了另一个关于它的帖子: Captured photos are black when using MediaCapture on Windows Phone 8.1

问题是MediaCapture.StartPreviewAsync引发了异常“在请求的操作中发生了意外错误”,我猜其原因是我没有的MediaElement(再次,桌面)。 / p>

我也很高兴找到一个有效的例子,当我搜索时,我没有找到任何实际样本来在桌面应用程序上实现MediaCapture,我看到一篇文章但没有附加代码: http://blogs.msdn.com/b/eternalcoding/archive/2013/10/29/how-to-use-specific-winrt-api-from-desktop-apps-capturing-a-photo-using-your-webcam-into-a-wpf-app.aspx

我还发现其他人也问了一个样本,但没有真正的答案......

我怎样才能得到一份工作样本?

2 个答案:

答案 0 :(得分:1)

MediaCapture在桌面应用中预览相机视频并非易事。我不确定所有的部分都在那里所以我在GitHub上放了一些代码来试试它,它似乎工作正常。

https://github.com/mmaitre314/MediaCaptureWPF

一个警告:构建MediaCapture / WPF互操作需要一些本机代码(C ++ / CLI),因此应用程序需要构建为x86或x64,而不是AnyCPU。

答案 1 :(得分:0)

为了使您的商店应用与相机互动,实际上有两种方式,一种是简单的,一种是高级的:

  • 使用提供的用户界面,这是一个用于捕获媒体的常用用户界面,它可以帮助您省去处理基本捕获操作的痛苦,
  • 或者自己与MediaCapture API进行交互,以获得对整个操作流程的完全控制。

如果您只想拍摄照片或视频 网络摄像头,我建议您使用主要使用CameraCaptureUI API的第一种方法,但如果您需要完全控制捕获操作,则需要一些与MediaCapture API交互的代码行

这是一个使用CameraCaptureUI API的简单示例:

假设我们有以下用户界面:

 <StackPanel Orientation="Vertical">
        <Button Click="TakePicture_Click" Content="Capture Photo" HorizontalAlignment="Stretch"/>
        <Border BorderBrush="White" BorderThickness="3">
            <Image x:Name="Picture" Height="700" VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Border>            
    </StackPanel>

此处捕获按钮单击处理程序:

private async void TakePicture_Click(object sender, RoutedEventArgs e)
    {
        var camera = new CameraCaptureUI();
        var image = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);
        if (image != null)
        {
            var stream = await image.OpenAsync(FileAccessMode.Read);
            var bitmap = new BitmapImage();
            bitmap.SetSource(stream);
            Picture.Source = bitmap;
        }
        else
        {
            (new MessageDialog("Something went wrong")).ShowAsync();                
        }
    }

您还需要通过检查App Manifest中的网络摄像头功能,为您的应用提供使用网络摄像头的权限

enter image description here