Как захватить видео с веб-камеры, используя единство? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь захватить видео с веб-камеры, используя единство и гололинзы. Я нашел этот пример на странице единства здесь . Я вставляю код ниже. Свет на камере включается, но не записывается. VideoCapture.CreateAsync не создает VideoCapture. Так что делегат там никогда не исполняется. Я видел эту тему , однако это было включено. В настройках плеера включены возможности веб-камеры и микрофона. В чем может быть проблема?

using UnityEngine;
using System.Collections;
using System.Linq;
using UnityEngine.XR.WSA.WebCam;

public class VideoCaptureExample : MonoBehaviour
{
    static readonly float MaxRecordingTime = 5.0f;

    VideoCapture m_VideoCapture = null;
    float m_stopRecordingTimer = float.MaxValue;

    // Use this for initialization
    void Start()
    {
        StartVideoCaptureTest();

        Debug.Log("Start");
    }

    void Update()
    {
        if (m_VideoCapture == null || !m_VideoCapture.IsRecording)
        {
            return;
        }

        if (Time.time > m_stopRecordingTimer)
        {
            m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
        }
    }

    void StartVideoCaptureTest()
    {
        Resolution cameraResolution = VideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
        Debug.Log(cameraResolution);

        float cameraFramerate = VideoCapture.GetSupportedFrameRatesForResolution(cameraResolution).OrderByDescending((fps) => fps).First();
        Debug.Log(cameraFramerate);


        VideoCapture.CreateAsync(false, delegate (VideoCapture videoCapture)
        {
            Debug.Log("NULL");
            if (videoCapture != null)
            {
                m_VideoCapture = videoCapture;
                Debug.Log("Created VideoCapture Instance!");

                CameraParameters cameraParameters = new CameraParameters();
                cameraParameters.hologramOpacity = 0.0f;
                cameraParameters.frameRate = cameraFramerate;
                cameraParameters.cameraResolutionWidth = cameraResolution.width;
                cameraParameters.cameraResolutionHeight = cameraResolution.height;
                cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

                m_VideoCapture.StartVideoModeAsync(cameraParameters,
                    VideoCapture.AudioState.ApplicationAndMicAudio,
                    OnStartedVideoCaptureMode);
            }
            else
            {
                Debug.LogError("Failed to create VideoCapture Instance!");
            }
        });

    }

    void OnStartedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
    {
        Debug.Log("Started Video Capture Mode!");
        string timeStamp = Time.time.ToString().Replace(".", "").Replace(":", "");
        string filename = string.Format("TestVideo_{0}.mp4", timeStamp);
        string filepath = System.IO.Path.Combine(Application.persistentDataPath, filename);
        filepath = filepath.Replace("/", @"\");
        m_VideoCapture.StartRecordingAsync(filepath, OnStartedRecordingVideo);
    }

    void OnStoppedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
    {
        Debug.Log("Stopped Video Capture Mode!");
    }

    void OnStartedRecordingVideo(VideoCapture.VideoCaptureResult result)
    {
        Debug.Log("Started Recording Video!");
        m_stopRecordingTimer = Time.time + MaxRecordingTime;
    }

    void OnStoppedRecordingVideo(VideoCapture.VideoCaptureResult result)
    {
        Debug.Log("Stopped Recording Video!");
        m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
    }
}

EDIT: Проблема заключалась в том, что API не работает на эмуляторе

1 Ответ

0 голосов
/ 27 апреля 2018

Вы должны попробовать взглянуть на эту тему здесь . Где подробно рассказывается о том, как записать видео с помощью HoloLens, а также о том, как сделать фотографию. Также убедитесь, что у вас установлены возможности веб-камеры и микрофона. Также, если вы пытаетесь сохранить его, убедитесь, что у вас также есть возможность библиотеки видео.

OnVideoCaptureCreated:

void OnVideoCaptureCreated (VideoCapture videoCapture)
{
   if (videoCapture != null)
   {
       m_VideoCapture = videoCapture;

       Resolution cameraResolution = VideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
       float cameraFramerate = VideoCapture.GetSupportedFrameRatesForResolution(cameraResolution).OrderByDescending((fps) => fps).First();

       CameraParameters cameraParameters = new CameraParameters();
       cameraParameters.hologramOpacity = 0.0f;
       cameraParameters.frameRate = cameraFramerate;
       cameraParameters.cameraResolutionWidth = cameraResolution.width;
       cameraParameters.cameraResolutionHeight = cameraResolution.height;
       cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

       m_VideoCapture.StartVideoModeAsync(cameraParameters,
                                           VideoCapture.AudioState.None,
                                           OnStartedVideoCaptureMode);
   }
   else
   {
       Debug.LogError("Failed to create VideoCapture Instance!");
   }
}

OnStartVideoCaptureMode:

void OnStartedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
{
   if (result.success)
   {
       string filename = string.Format("MyVideo_{0}.mp4", Time.time);
       string filepath = System.IO.Path.Combine(Application.persistentDataPath, filename);

       m_VideoCapture.StartRecordingAsync(filepath, OnStartedRecordingVideo);
   }
}

OnStartRecordingVideo:

void OnStartedRecordingVideo(VideoCapture.VideoCaptureResult result)
{
   Debug.Log("Started Recording Video!");
   // We will stop the video from recording via other input such as a timer or a tap, etc.
}

StopRecordingVideo:

// The user has indicated to stop recording
void StopRecordingVideo()
{
   m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
}

OnStopRecordingVideo:

void OnStoppedRecordingVideo(VideoCapture.VideoCaptureResult result)
{
   Debug.Log("Stopped Recording Video!");
   m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
}

void OnStoppedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
{
   m_VideoCapture.Dispose();
   m_VideoCapture = null;
}
...