PhotoCapture CreateAsync callback not working and Failed to initialize IMediaCapture (hr = 0xC00DABE0) error
I am working with the Microsoft Hololens to use the Photocapture API. I have been troubleshooting this for a couple weeks. This is a similar problem to the question seen here. I also went through similar troubleshooting at the following githubpage. I have tried cloning other projects that say they are working, but I have not been able to replicated those. I have looked at a lot of webpages and I am open to more if anyone has any to share. At this point, I have not tried writing any custom code. I am still working on getting my PoC of Photocapturing.
In the code below I am using Unity 2019.1.4f1. I have two different attempts as defined by the regions that are unrelated to eachother. I am getting this error currently: Failed to initialize IMediaCapture (hr = 0xC00DABE0)
. This does not work when I press play on Unity, use the Holographic Emulator, or deploy to the Hololens. I have both Web and Microphone capabilities turned on. Additionally, Research Mode is turned off on my headset.
using UnityEngine;
using System.Linq;
using UnityEngine.XR.WSA.WebCam;
using System.IO;
public class PhotoCaptureExample : MonoBehaviour
{
private PhotoCapture photoCaptureObject = null;
private Texture2D targetTexture = null;
private const string FILE_NAME = @"cognitive_analysis.jpg";
// Use this for initialization
void Start()
{
//OriginalMethod();
takePhoto();
}
#region Second Attempt
private void takePhoto()
{
PhotoCapture.CreateAsync(false, this.OnPhotoCreated);
}
private void OnPhotoCreated(PhotoCapture captureObject)
{
this.photoCaptureObject = captureObject;
Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
CameraParameters c = new CameraParameters()
{
hologramOpacity = 0.0f,
cameraResolutionWidth = cameraResolution.width,
cameraResolutionHeight = cameraResolution.height,
pixelFormat = CapturePixelFormat.BGRA32
};
captureObject.StartPhotoModeAsync(c, this.OnPhotoModeStarted);
}
private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
{
if (result.success)
{
string filename = string.Format(FILE_NAME);
string filePath = Path.Combine(Application.persistentDataPath, filename);
this.photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, this.OnCapturedPhotoToDisk);
}
else
{
Debug.LogError("Unable to start photo mode.");
}
}
private void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)
{
if (result.success)
{
/**
string filename = string.Format(FILE_NAME);
string filePath = Path.Combine(Application.persistentDataPath, filename);
byte[] image = File.ReadAllBytes(filePath);
// We have the photo taken.
*/
Debug.Log("Photo taken");
}
else
{
Debug.LogError("Failed to save Photo to disk.");
}
this.photoCaptureObject.StopPhotoModeAsync(this.OnStoppedPhotoMode);
}
#endregion
#region Original
private void OriginalMethod()
{
Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
// Create a PhotoCapture object
PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject) {
photoCaptureObject = captureObject;
CameraParameters cameraParameters = new CameraParameters();
cameraParameters.hologramOpacity = 0.0f;
cameraParameters.cameraResolutionWidth = cameraResolution.width;
cameraParameters.cameraResolutionHeight = cameraResolution.height;
cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;
// Activate the camera
photoCaptureObject.StartPhotoModeAsync(cameraParameters, delegate (PhotoCapture.PhotoCaptureResult result) {
// Take a picture
photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
});
});
}
void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
{
// Copy the raw image data into the target texture
photoCaptureFrame.UploadImageDataToTexture(targetTexture);
// Create a GameObject to which the texture can be applied
GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
Renderer quadRenderer = quad.GetComponent<Renderer>() as Renderer;
quadRenderer.material = new Material(Shader.Find("Custom/Unlit/UnlitTexture"));
quad.transform.parent = this.transform;
quad.transform.localPosition = new Vector3(0.0f, 0.0f, 3.0f);
quadRenderer.material.SetTexture("_MainTex", targetTexture);
// Deactivate the camera
photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
}
private void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
{
// Shutdown the photo capture resource
photoCaptureObject.Dispose();
photoCaptureObject = null;
}
#endregion
}
If it is something stupid or complex, I appreciate any and all suggestions! Thanks a lot.