none
摄像机初始化问题 RRS feed

  • 问题

  • Platform::Agile<Windows::Media::Capture::MediaCapture^>pCaptureManager = nullptr;
     
    pCaptureManager = ref new Windows::Media::Capture::MediaCapture();
                    MediaCaptureInitializationSettings^ mediaCaptureInitializationSettings = ref new MediaCaptureInitializationSettings();
                    mediaCaptureInitializationSettings->VideoDeviceId = di->Id;
                    mediaCaptureInitializationSettings->StreamingCaptureMode = StreamingCaptureMode::Video;
                    mediaCaptureInitializationSettings->PhotoCaptureSource = PhotoCaptureSource::Auto;
    
    auto init = pCaptureManager.Get()->InitializeAsync(mediaCaptureInitializationSettings);
    或者
    auto init = create_task(pCaptureManager.Get()->InitializeAsync(mediaCaptureInitializationSettings)).then([](){
                    });
    
    //启动出错  说没有初始化   实在没有弄明白
    pCaptureManager->StartPreviewAsync();



    2015年8月10日 10:01

答案

  • 已经解决了,可以是你所说的问题。

    我将开关灯用一个按钮是控制就解决了

     m_pCaptureManager->VideoDeviceController->TorchControl->Enabled = true;

    还不是很明白create_task创建任务的原理

    看了些别人的帖子 感觉c就是用task替代了传统的创建线程方式,那么task执行任务的时候并不是UI线程执行

    是我启动预览就启动摄像机,从这个我也明白了一点,假如闪关灯从task中启动,那么闪关灯对象应该有一个异步的方法。然而这并不是使用异步启动闪关灯。

    • 已标记为答案 贺利湘 2015年8月13日 6:26
    2015年8月13日 6:26

全部回复

  • Hello,

    对于C++程序不是很熟悉,我在网上找了下,有个官方sample,你可以看下:

    https://code.msdn.microsoft.com/windowsapps/media-capture-sample-adf87622

    虽然他写的是windows 应用,但MediaCapture API是通用的,你可以参考AudioCapture.xaml这个页面的里后天代码, 我看了下应该是用于初始化MediaCapture对象的。

    Regards


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年8月11日 2:02
    版主
  • Hello,

    对于C++程序不是很熟悉,我在网上找了下,有个官方sample,你可以看下:

    https://code.msdn.microsoft.com/windowsapps/media-capture-sample-adf87622

    虽然他写的是windows 应用,但MediaCapture API是通用的,你可以参考AudioCapture.xaml这个页面的里后天代码, 我看了下应该是用于初始化MediaCapture对象的。

    Regards


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    使用那个例子我已经做到摄像机预览和开启闪关灯,但是第二次打开闪关灯失败

    2015年8月11日 5:19
  • >>使用那个例子我已经做到摄像机预览和开启闪关灯,但是第二次打开闪关灯失败

    失败的话,有什么错误信息报出吗?有的话建议你可以在论坛上贴出来。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年8月12日 1:54
    版主
  • >>使用那个例子我已经做到摄像机预览和开启闪关灯,但是第二次打开闪关灯失败

    失败的话,有什么错误信息报出吗?有的话建议你可以在论坛上贴出来。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    没有任何错误信息

    开启闪关灯的代码:

    if (m_pCaptureManager->VideoDeviceController->TorchControl->Supported)
    {
        m_pCaptureManager->VideoDeviceController->TorchControl->Enabled = true;
    }

    每次开闪关灯的时候都会执行上面那段代码,但是有时候就是不会亮

    2015年8月12日 2:52
  • Hi,

    >>每次开闪关灯的时候都会执行上面那段代码,但是有时候就是不会亮

    有时候不亮那就意味着用上面代码,是可以点亮闪光灯的,不亮的情况有可能是代码还在等待执行。你可以试下用CoreDispatcher class来封装你的启动闪光灯的操作,然后给这个Task设置高优先级试下会不会有改善:

    https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.core.coredispatcher.aspx

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年8月13日 1:34
    版主
  • test
    2015年8月13日 2:06
  • Hi,

    >>每次开闪关灯的时候都会执行上面那段代码,但是有时候就是不会亮

    有时候不亮那就意味着用上面代码,是可以点亮闪光灯的,不亮的情况有可能是代码还在等待执行。你可以试下用CoreDispatcher class来封装你的启动闪光灯的操作,然后给这个Task设置高优先级试下会不会有改善:

    https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.core.coredispatcher.aspx

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    我设置Nomal和High优先级了还是不行

    if (!m_bPreviewing){ m_pCaptureManager = ref new Windows::Media::Capture::MediaCapture(); auto myDispatcher = CoreWindow::GetForCurrentThread()->Dispatcher; DeviceInformationCollection^ myDevInfoList = nullptr; create_task(myDispatcher->RunAsync(CoreDispatcherPriority::High , ref new Windows::UI::Core::DispatchedHandler([this](){ create_task(DeviceInformation::FindAllAsync(DeviceClass::VideoCapture)).then([this](task<DeviceInformationCollection^> findTask){ auto myDevInfoList = findTask.get(); for (unsigned int i = 0; i < myDevInfoList->Size; i++) { auto devInfo = myDevInfoList->GetAt(i); if (devInfo->EnclosureLocation != nullptr) { if (devInfo->EnclosureLocation->Panel == Windows::Devices::Enumeration::Panel::Back) { auto settings = ref new Windows::Media::Capture::MediaCaptureInitializationSettings(); settings->VideoDeviceId = devInfo->Id; create_task(m_pCaptureManager->InitializeAsync(settings)).then([this](task<void> initTask) { initTask.get(); capture1->Source = m_pCaptureManager; create_task(m_pCaptureManager->StartPreviewAsync()).then([this](task<void> previewTask) { previewTask.get(); if (m_pCaptureManager->VideoDeviceController->TorchControl->Supported){ m_pCaptureManager->VideoDeviceController->TorchControl->Enabled = true; } m_bPreviewing = true; }); }); } } } }); }))).then([](task<void> RunTask){ RunTask.get(); }); }

    m_pCaptureManager->VideoDeviceController->TorchControl->Enabled = true;

    Debug调试的时候这句代码都能执行到,难道应用商店打开手电筒不是用这个方法?

    因为貌似还有一个DLL里面有很多未公开的API ShellChromeAPI.dll,但是我在我电脑上找不到这个DLL

    然而C#是引用锁屏API成功

    [System.Runtime.InteropServices.DllImport("ShellChromeAPI.dll")]

    private extern static void Shell_TurnScreenOn(bool value);




    2015年8月13日 5:08
  • 已经解决了,可以是你所说的问题。

    我将开关灯用一个按钮是控制就解决了

     m_pCaptureManager->VideoDeviceController->TorchControl->Enabled = true;

    还不是很明白create_task创建任务的原理

    看了些别人的帖子 感觉c就是用task替代了传统的创建线程方式,那么task执行任务的时候并不是UI线程执行

    是我启动预览就启动摄像机,从这个我也明白了一点,假如闪关灯从task中启动,那么闪关灯对象应该有一个异步的方法。然而这并不是使用异步启动闪关灯。

    • 已标记为答案 贺利湘 2015年8月13日 6:26
    2015年8月13日 6:26