如何统一使用网络摄像机捕获视频? [英] How to capture video from web camera using unity?

查看:86
本文介绍了如何统一使用网络摄像机捕获视频?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用unitol和hololens从网络摄像机捕获视频.我在此处的统一页面上找到了此示例.我正在粘贴下面的代码.凸轮上的灯点亮,但是不记录. VideoCapture.CreateAsync 不会创建VideoCapture.因此,那里的委托永远不会执行.我看到了该线程,但是该线程已经打开.在播放器设置中,网络摄像头和麦克风功能已打开.可能是什么问题?

I am trying to capture video from web camera using unity and hololens. I found this example on the unity page here . I am pasting the code below. The light on the cam turns on, however it doesnt record. The VideoCapture.CreateAsync doesnt create a VideoCapture. So the delegate there is never executed. I saw this thread, however that was on. On the player settings the webcam and microphone capabilities are on. What could be the problem?

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);
    }
}

问题是该API在模拟器上不起作用

The problem was that the API doesnt work on the Emulator

推荐答案

您应该尝试看一下该线程

You should try taking a look at this thread here. Where it goes into detail on how to record a video with HoloLens as well as how to take a photo. Also make sure you have the WebCam and microphone capabilities set. Also if you are trying to save it, make sure you have the Videos Library capability as well.

OnVideoCaptureCreated:

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:

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:

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:

StopRecordingVideo:

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

OnStopRecordingVideo:

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;
}

这篇关于如何统一使用网络摄像机捕获视频?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆