我在Hololens上用UWP(C ++ / WinRT)-没有Unity编写了一个应用程序。该应用程序尝试像这样从前置摄像头开始视频捕获:
IAsyncAction Init()
{
std::lock_guard<std::mutex> guard(m_lock);
m_mediaCapture = MediaCapture();
m_mediaCapture.Failed([this](auto&& sender, auto&& args)
{ /* log the error */ });
MediaCaptureInitializationSettings mcis;
mcis.StreamingCaptureMode(StreamingCaptureMode::Video);
mcis.MediaCategory(MediaCategory::Media);
mcis.MemoryPreference(MediaCaptureMemoryPreference::Cpu);
co_await m_mediaCapture.InitializeAsync(mcis);
co_return;
}
IAsyncAction Start(const MediaCapture& mc)
{
std::lock_guard<std::mutex> guard(m_lock);
for (auto src: mc.FrameSources())
{
MediaFrameSource source = src.Value();
MediaFrameSourceInfo info = source.Info();
if(IsTheCameraIWant(info))
{
m_reader = mc.CreateFrameReaderAsync(source).get();
m_reader.AcquisitionMode(MediaFrameReaderAcquisitionMode::Realtime);
m_reader.FrameArrived([this](auto&& mfr, auto&& args){ HandleCapturedFrame(mfr, args); });
}
}
co_return;
}
void HandleCapturedFrame(const MediaFrameReader &reader, const MediaFrameArrivedEventArgs& args)
{
std::lock_guard<std::mutex> guard(m_lock);
auto frame = reader.TryAcquireLatestFrame();
// do something with the frame
frame.Close();
}
问题是,启动相机不可靠。当我将应用程序部署到Hololens或使其从VS运行时,相机会初始化并正常运行。当我关闭应用程序并重新打开时,Start
无例外地执行,但是MediaCapture.Failed
处理程序将触发并显示消息A media source cannot go from the stopped state to the paused state.
。 Hololens上的隐私摄像头LED也未点亮,并且我没有视频帧。从VS重新部署或重新启动Hololens会有所帮助,但会给我一两次成功的初始化,然后再次出现故障。
当应用程序关闭时,我进行了co_await m_reader.StopAsync()
,m_reader.Close()
和m_mediaCapture.get().Close()
,我想不起要进行的任何清理工作。
有人知道如何获得一致的相机初始化吗?也许有些清理我可能会忘记...