2015-10-28 15 views
5

Everytime WriteableBitmap için.dönüştürme SoftwareBitmap

private async void Start(object sender, RoutedEventArgs e) 
     { 

      _MediaCapture = new MediaCapture(); 
      await _MediaCapture.InitializeAsync(); 

      mediaElement.Source = _MediaCapture; 
      await _MediaCapture.StartPreviewAsync(); 
      DispatcherTimer timer = new DispatcherTimer(); 
      timer.Interval = new TimeSpan(0, 0, 0, 1); 
      timer.Tick += HandleTimerTick; 
      timer.Start(); 
     } 

     private async void HandleTimerTick(object Sender, object E) 
     { 


      var frame = await _MediaCapture.GetPreviewFrameAsync(); 
      SoftwareBitmap frameBitmap = frame.SoftwareBitmap; 
      WriteableBitmap bitmap = new WriteableBitmap(frameBitmap.PixelWidth, frameBitmap.PixelHeight); 
      try 
      { 
       frameBitmap.CopyToBuffer(bitmap.PixelBuffer); 
      } 
      catch (Exception) 
      { 
       Debug.WriteLine("Exception "); 
      } 
     } 

hat

frameBitmap.CopyToBuffer(bitmap.PixelBuffer); 

İstisna atıyor:

İşte bunun için benim kod parçacığı olduğunu.

Bunu x64 RemoteDevice üzerinde hata ayıkladım.

+0

atılır: Aşağıdaki şekilde

Sen kodu kullanarak bu sorunu çözebilirsiniz? –

+0

@Dmitry Bychenko Yukarıya bakın: System.Runtime.InteropServices.COMException – TheTanic

+0

Yan not: * yakalama * özel durumlar (catch (Exception) {Debug.WriteLine ("Exception"); } 'çok kötü bir uygulamadır *. –

cevap

6

Kodunuzu kullanarak bu sorunu yeniden oluşturabilirim. Frame.SoftwareBitmap her zaman null değerini döndürür. İstisna ne

private async void button_Click(object sender, RoutedEventArgs e) 
    { 
     _mediaCapture = new MediaCapture(); 

     await _mediaCapture.InitializeAsync(); 

     mediaElement.Source = _mediaCapture; 

     await _mediaCapture.StartPreviewAsync(); 

     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = new TimeSpan(0, 0, 0, 1); 
     timer.Tick += Timer_Tick; 
     timer.Start(); 
    } 

    private async void Timer_Tick(object sender, object e) 
    { 
     var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties; 

     var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height); 

     var frame = await _mediaCapture.GetPreviewFrameAsync(videoFrame); 

     SoftwareBitmap frameBitmap = frame.SoftwareBitmap; 

     WriteableBitmap bitmap = new WriteableBitmap(frameBitmap.PixelWidth, frameBitmap.PixelHeight); 

     frameBitmap.CopyToBuffer(bitmap.PixelBuffer); 

     Debug.WriteLine("done"); 
    } 
+0

İyi çalışıyor. Teşekkürler – TheTanic

+0

@Jeffrey Bunun nasıl yardımcı olduğunu anlamıyorum ... Tek gerçek fark GetPreviewFrameAsync'in dönüş değerini kullanıyor gibi görünüyor. Bu mantıklı değil! Bu işlev, doldurulması için geçirilen VideoFrame'i kullanmaz mı? Öyleyse farklı bir şekilde belgelenmelidir. InitializeAsync'te VideoFrame'den farklı bir bitmap piksel formatı belirtirseniz, yüksek bir isabet olup olmadığını da söyler misiniz? –

+0

@Jeffrey Açık olmak gerekirse ... işe yarıyor! Sadece kafam karıştı neden. –