UWP C#控制台模板应用程序:MediaCapture无法录制视频

时间:2019-05-31 14:20:42

标签: c# uwp mediacapture

我试图在基于C#UWP控制台模板的最小应用程序上使用MediaCapture来捕获视频。使用InitializeAsync()初始化MediaCapture可以,但是实际上开始录制失败,错误代码为0xc00d3e82 / MF_E_INVALID_STATE_TRANSITION。

我已在Visual Studio 2017中安装了C#UWP控制台应用程序模板,以在可以使用MediaCapture捕获视频的最小应用程序(在这种情况下,无需GUI,因此是控制台应用程序)上工作。最低目标是Windows build 1803,因为这是C#UWP控制台应用程序所要求的最低目标。

我尝试用ConfigureAwait(false)运行需要等待的方法,但这似乎没有什么区别。

关于功能,由于UWP控制台应用程序将不会显示获取对摄像机,麦克风等的访问权限的权限提示,因此我在运行之前通过应用程序的设置手动授予它们。我相信清单中会包含所有必需的功能,因为该应用程序在某些情况下确实可以运行(请参见代码块后面的段落)。

代码遵循非常基本的MediaCapture设置:

MediaCapture mc = new MediaCapture();
MediaCaptureInitializationSettings mcs = new MediaCaptureInitializationSettings();

mcs.AudioDeviceId = "";
mcs.VideoDeviceId = cameraDevice.Id;
mcs.StreamingCaptureMode = StreamingCaptureMode.Video;
mcs.PhotoCaptureSource = PhotoCaptureMode.VideoPreview;

await mc.InitializeAsync(mcs);

// code for creating the file to save capture would be here

LowLagMediaRecording mr = await mc.PrepareLowLagRecordToStorageFileAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto, file);

await mr.StartAsync()

代码在从控制台应用程序的Main()启动的单独的异步任务中运行,但是我也尝试过使Main本身成为异步任务,并直接从那里运行MediaCapture代码,而在性能上没有任何区别。 / p>

有趣的是,如果在尝试录制视频之前,我使用Visual Studio的调试器运行该应用程序或将该调试器附加到该进程,则视频捕获就可以正常工作。但是,如果从命令提示符/ Powershell或开始菜单运行,则调用LowLagMediaRecording实例的StartAsync()方法将导致上述错误代码0xc00d3e82 / MF_E_INVALID_STATE_TRANSITION,并且不会录制任何视频。

非常感谢在没有调试器的情况下运行时会出现什么问题以及如何解决该问题。

1 个答案:

答案 0 :(得分:0)

是否有任何特定原因要成为UWP应用? (UWP控制台应用程序和后台录制可能存在某些问题/并发症) 如果UWP不重要,您也可以在Win32控制台应用程序中使用MediaCapture,在这种情况下,它似乎更适合(并且是更简单的解决方案), 对于C#,请参考- https://github.com/microsoft/WindowsVisionSkillsPreview/blob/master/samples/SentimentAnalyzerCustomSkill/cs/Apps/FaceSentimentAnalysisApp_.NETCore3.0/FaceSentimentAnalysisApp_.NETCore3.0.csproj

注:此C#示例不只是Windows MediaCapture。但是,您可以忽略其他内容,而仅引用示例中的项目配置,并使用与当前相同的C#代码。 您将需要.Net Core 3.0和Visual Studio 2019预览版才能使用此功能。
上面的.csproj文件中的以下几行至关重要:              C:\ Program Files(x86)\参考程序集\ Microsoft \ Framework.NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll     

<Reference Include="Windows">
  <HintPath>C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade\Windows.WinMD</HintPath>
  <IsWinMDFile>true</IsWinMDFile>
</Reference>

<Reference Include="Windows.Foundation.FoundationContract">
  <HintPath>C:\Program Files (x86)\Windows Kits\10\References\10.0.17763.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd</HintPath>
  <IsWinMDFile>true</IsWinMDFile>
</Reference>

<Reference Include="Windows.Foundation.UniversalApiContract">
  <HintPath>C:\Program Files (x86)\Windows Kits\10\References\10.0.17763.0\Windows.Foundation.UniversalApiContract\7.0.0.0\Windows.Foundation.UniversalApiContract.winmd</HintPath>
  <IsWinMDFile>true</IsWinMDFile>
</Reference>

或者对于C ++,请参考-https://github.com/microsoft/Windows-Camera/tree/master/Samples/WMCConsole_winrtcpp