MediaCapture VideoStabilization失败0xC00D4A3E

问题描述:

我工作的支持VideoStabilization effect视频录制应用程序,但是当我开始拍摄,我收到过MediaCapture.Failed事件以下几乎瞬间:MediaCapture VideoStabilization失败0xC00D4A3E

样品分配器目前是空的,因为有突出的要求。 (0xC00D4A3E)

它只发生在我使用推荐配置的效果,但。如果我不打电话SetUpVideoStabilizationRecommendationAsync,它工作正常。

下面是我设置它:

private MediaEncodingProfile _encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto); 

    private async Task CreateVideoStabilizationEffectAsync() 
    { 
     var definition = new VideoStabilizationEffectDefinition(); 

     _videoStabilizationEffect = (VideoStabilizationEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoRecord); 
     _videoStabilizationEffect.Enabled = true; 

     await SetUpVideoStabilizationRecommendationAsync(); 
    } 

    private async Task SetUpVideoStabilizationRecommendationAsync() 
    { 
     var properties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoRecord) as VideoEncodingProperties; 
     var recommendation = _videoStabilizationEffect.GetRecommendedStreamConfiguration(_mediaCapture.VideoDeviceController, properties); 

     if (recommendation.InputProperties != null) 
     { 
      await _mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoRecord, recommendation.InputProperties); 
     } 

     if (recommendation.OutputProperties != null) 
     { 
      _encodingProfile.Video = recommendation.OutputProperties; 
     } 
    } 

    private async Task StartRecordingAsync() 
    { 
     var videoFile = await KnownFolders.PicturesLibrary.CreateFileAsync("StableVideo.mp4", CreationCollisionOption.GenerateUniqueName); 
     await _mediaCapture.StartRecordToStorageFileAsync(_encodingProfile, videoFile); 
    } 

GetRecommendedStreamConfiguration方法的desiredProperties参数需要得到MediaEncodingProfile调用你的MediaCapture.StartRecordTo*选择(即“输出特性”)时,将使用看看你想要的VideoEncodingProperties是什么。

错误正在触发,因为VideoDeviceController(即“输入属性”)的VideoEncodingProperties正在被传递。如果你仔细想想,VideoDeviceController的一个实例已经作为参数传入了方法,所以这个效果已经可以访问那个properties var的信息了。在同一时间单独通过它们没有多大意义。相反,它需要的是关于另一个端点的信息。那有意义吗?至少我是这么试图合理化它的。

的上Microsoft github repoofficial SDK sample for VideoStabilization显示如何正确地做到这一点:

/// <summary> 
    /// Configures the pipeline to use the optimal resolutions for VS based on the settings currently in use 
    /// </summary> 
    /// <returns></returns> 
    private async Task SetUpVideoStabilizationRecommendationAsync() 
    { 
     Debug.WriteLine("Setting up VS recommendation..."); 

     // Get the recommendation from the effect based on our current input and output configuration 
     var recommendation = _videoStabilizationEffect.GetRecommendedStreamConfiguration(_mediaCapture.VideoDeviceController, _encodingProfile.Video); 

     // Handle the recommendation for the input into the effect, which can contain a larger resolution than currently configured, so cropping is minimized 
     if (recommendation.InputProperties != null) 
     { 
      // Back up the current input properties from before VS was activated 
      _inputPropertiesBackup = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoRecord) as VideoEncodingProperties; 

      // Set the recommendation from the effect (a resolution higher than the current one to allow for cropping) on the input 
      await _mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoRecord, recommendation.InputProperties); 
      Debug.WriteLine("VS recommendation for the MediaStreamProperties (input) has been applied"); 
     } 

     // Handle the recommendations for the output from the effect 
     if (recommendation.OutputProperties != null) 
     { 
      // Back up the current output properties from before VS was activated 
      _outputPropertiesBackup = _encodingProfile.Video; 

      // Apply the recommended encoding profile for the output, which will result in a video with the same dimensions as configured 
      // before VideoStabilization was added if an appropriate padded capture resolution was available. Otherwise, it will be slightly 
      // smaller (due to cropping). This prevents upscaling back to the original size, which can result in a loss of quality 
      _encodingProfile.Video = recommendation.OutputProperties; 
      Debug.WriteLine("VS recommendation for the MediaEncodingProfile (output) has been applied"); 
     } 
    }