IEnumerator с функцией голосовых команд - PullRequest
0 голосов
/ 20 июня 2020

У меня есть проект, в котором я использую только голосовую команду для выполнения другой функции, и одна из них - сделать снимок с помощью Hololens. Поэтому я использую функцию StartCoroutine(photoshoot()); для вызова IEnumerator photoshoot(). IEnumerator photoshoot() вызывает TakePhotosnap();.

Он отлично снимает фото, но у меня проблема после того, как он сделал снимок, он go не возвращается к IEnumerator.

Он останавливается код и не может выполнять другие функции.

Как вы можете видеть в моем коде (я поставил несколько чисел, чтобы помочь мне объяснить функцию)

Я вызываю StartCoroutine(photoshoot()); строку 11, а в IEnumerator photoshoot() вызываю TakePhotosnap(); строку 12, и она выполняет сфотографировать до линии 13 Debug.Log("we finish taking photo successfully "); и потом остановиться. Он должен go в строке 14 в IEnumerator photoshoot().

Вот часть моего кода

private void Takephoto()

{

// this function is to call to take a photo and save it in a special folder

Debug.Log("Take Photo function call is started");

11 StartCoroutine(photoshoot());

Debug.Log("Take Photo for Hololens");

}

IEnumerator photoshoot()

{

Debug.Log(" The taking photo coroutine is started ");

yield return new WaitForEndOfFrame();

Debug.Log("Take Photo");

12 TakePhotosnap();

14 Debug.Log("Finish taking Hi again ");

yield return new WaitForEndOfFrame();

GameObject.Find("Cube").transform.localPosition = new Vector3(Random.Range(-1, 1), 0, Random.Range(1, 3));

GameObject.Find("Cube").SetActive(true);

}

--------------------------------------------

private void TakePhotosnap()

{

Debug.Log("TakePhoto Call StartPhotoModeAsync () method to start the photo mode");

Debug.Log("snap pic taken");

PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);

}

void OnPhotoCaptureCreated(PhotoCapture captureObject)

{

//Store objects, configure shooting parameters and start shooting mode.

Debug.Log("Start taking photo calling function");

photoCaptureObject = captureObject;

Debug.Log("set camera parameters");

Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();

CameraParameters c = new CameraParameters();

/// c= CameraParameters

c.hologramOpacity = 1.0f;

c.cameraResolutionWidth = cameraResolution.width;

c.cameraResolutionHeight = cameraResolution.height;

c.pixelFormat = CapturePixelFormat.BGRA32;

Debug.Log("camera parameters finish");

captureObject.StartPhotoModeAsync(c, OnPhotoModeStarted);

}

private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)

{

if (result.success)

{

//string filename = string.Format(@"CapturedImage{0}_n.jpg", Time.time);

string filename = string.Format(@"alc.jpg", Time.time);

Debug.Log("FileName: =" + filename);

string filePath = System.IO.Path.Combine(Application.persistentDataPath, filename);

Debug.Log("filePath: =" + filePath);

/////

string targetPath = @"C: \Users\ABC\Pictures\Camera Roll";

string destFile = System.IO.Path.Combine(targetPath, filename);

Debug.Log("destFile: =" + destFile);

if (!System.IO.File.Exists(filePath))

{

//System.IO.File.Create(filePath);

System.IO.File.Create(filePath).Dispose();

}

// https://blog.csdn.net/Lee_gc/java/article/details/79919042

Debug.Log("filePath filePath: =" + filePath);

string filePath2 = System.IO.Path.Combine(Application.dataPath, filename);

Debug.Log("filePath2: =" + filePath2);

Debug.Log("finish to set photo file path and name");

//photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);

Debug.LogError("Saved That Image Somewhere" + "FileName: =" + filename + " FilePath: = " + filePath + " FilePath2: = " + filePath2);

Debug.Log("finish to copy photo to new directory");

Debug.Log("finish photo");

photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);

13 Debug.Log("we finish taking photo successfuly ");

}

else

{

Debug.LogError("Unable to start photo mode!");

}

}

// clean up

void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)

{

Debug.Log("result=" + result);

photoCaptureObject.Dispose();

photoCaptureObject = null;

}

void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)

{

if (result.success)

{

Debug.Log("Saved Photo to disk!");

photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);

}

else

{

Debug.Log("Failed to save Photo to disk");

}

}

}

Что не так с моим кодом? Есть ли другой способ решить эту проблему?

1 Ответ

0 голосов
/ 23 июня 2020

Фактически, код 14 запускается раньше, чем вы думаете. В функции TakePhotosnap, когда асинхронный метод PhotoCapture.CreateAsync() запускается, этот метод вернет управление вызывающему методу, а затем немедленно будет выведено «Fini sh take Hi». Кроме того, также из-за асинхронности, код 13 будет выводиться до того, как какой-либо результат будет возвращен из метода TakePhotoAsync, поэтому он не означает, что фотография была сделана успешно.

Поэтому мы рекомендуем вам добавить точки останова в ваш код, чтобы определить, выполняется ли код 14, и попробуйте переместить оператор журнала в обратный вызов. Например:

photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);

Debug.Log("we finish taking photo successfuly ");

=>

photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);


void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)

{
    if (result.success)

    {

        Debug.Log("we finish taking photo successfuly ");

    }
}

Кроме того, вам стоит прочитать этот do c: Асинхронное программирование с asyn c и await

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...