2013-05-12 4 views
0

Я использую класс захвата мультимедиа Windows 8, чтобы щелкнуть фотографию в приложении для рабочего стола и скопировать ее в буфер обмена.Замедленный захват камеры

Моя функция принимает два входа в качестве аргумента, 1) нужное устройство (спереди, сзади или USB веб-камеры) и 2) желаемое разрешение

Здесь функции:

async public void UseCamera(int x, int y) 
    { 
     MediaCapture _mediaCapture = new MediaCapture(); 
     var _ImageFormat = ImageEncodingProperties.CreatePng(); 
     var _fileStream = new InMemoryRandomAccessStream(); 
     MediaCaptureInitializationSettings _cameraSettings1 = new MediaCaptureInitializationSettings(); 
     DeviceInformationCollection _deviceInformationCollection = null; 
     IReadOnlyList<IMediaEncodingProperties> res; 

     _deviceInformationCollection = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); 

     if (x > _deviceInformationCollection.Count - 1) 
     { 
      MessageBox.Show("Device Not found"); 
     } 

     else 
     { 
      _cameraSettings1.VideoDeviceId = _deviceInformationCollection[x].Id; 
      _cameraSettings1.AudioDeviceId = ""; 
      _cameraSettings1.PhotoCaptureSource = PhotoCaptureSource.VideoPreview; 
      _cameraSettings1.StreamingCaptureMode = StreamingCaptureMode.Video; 

      await _mediaCapture.InitializeAsync(_cameraSettings1); 

      res = _mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview); 

      uint maxResolution = 0; 
      List<int> indexMaxResolution = new List<int>(); 
      if (res.Count >= 1) 
      { 
       for (int i = 0; i < res.Count; i++) 
       { 
        VideoEncodingProperties vp = (VideoEncodingProperties)res[i]; 

        if (vp.Width > maxResolution) 
        { 
         indexMaxResolution.Add(i); 
         maxResolution = vp.Width; 
        } 
       } 

       indexMaxResolution.Reverse(); 
       if (y > indexMaxResolution.Count()) 
       { 
        MessageBox.Show("Maximum supported resolution index : " + (indexMaxResolution.Count - 1).ToString()); 
       } 

       //this is the part that I believe is the trouble maker 


       else 
       { 
        await _mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoPreview, res[indexMaxResolution.ElementAt(y)]); 
        await _mediaCapture.CapturePhotoToStreamAsync(_ImageFormat, _fileStream); 

        Clipboard.SetImage(Image.FromStream(_fileStream.AsStream())); 
       } 
      } 
     } 
    } 

Функция работает, но проблема в том, что она невероятно медленная. Для захвата фотографии требуется почти 4-5 секунд. Может кто-нибудь сказать мне, где я иду не так, и как я могу ускорить процесс. Потому что я тестировал свою камеру, и она может принимать клики @ почти 2 фото в секунду.

ответ

0

Если вы переместите все запросы инициализации и информации об устройстве в функцию инициализации, вы можете увидеть увеличение скорости.

По моему опыту получение информации об устройстве происходит медленно.

Постарайтесь сделать как можно больше вперед, чтобы при наступлении времени на захват нужно было делать только необходимые вещи.

+0

Я тоже это пробовал .. Я инициализировал все три камеры и перечислил их разрешение перед началом запуска программы. Инициализация камеры и индексация разрешений выполняются довольно быстро, я считаю, что фактический захват замедляет работу. –

+0

Вы также можете попытаться сохранить изображения в памяти и написать их только в случае необходимости. Буфер обмена может быть слишком медленным. Это единственное, что вы можете изменить, насколько я знаю. Возможно, добавление некоторых таймеров может помочь вам указать самые медленные части. –

Смежные вопросы