#c# #wpf #ms-media-foundation
Вопрос:
Я использую Media Foundation в своем приложении WPF для реализации функций, аналогичных приложению камеры Windows: показ веб-камеры в прямом эфире и получение изображения с высоким разрешением при нажатии кнопки. В то время как приложение камеры Windows всегда делает правильно выставленный снимок, снимок, сделанный Media Foundation, часто бывает передержан.
Приложение используется только устройствами, имеющими встроенное высокое разрешение для фотографий (например, Surface Go 2, Surface 7 Pro,…). Для создания снимка вместо считывания одного кадра видеопотока используется определенный поток изображений.
Я уже пытался изменить свойства IAMCameraControl и IAMVideoProcAmp, такие как экспозиция или яркость, прежде чем делать снимок, но фотография всегда была передержана.
Существуют ли какие-либо дополнительные настройки или подходы для устранения передержки при съемке снимка с высоким разрешением (например. так же, как работает приложение Windows Camera)?
Переэкспонированный снимок
Высокое разрешение для фотографий
Код для создания моментального снимка
IMFCaptureEngineClassFactory captureEngineClassFactory = null;
IMFCaptureEngine captureEngine = null;
IMFCapturePhotoSink capturePhotoSink = null;
IMFMediaType photoMediaType = null;
try
{
// Create a CaptureEngineClassFactory
captureEngineClassFactory = mff.GetCaptureEngineClassFactory();
// Create a CaptureEngine
captureEngine = mff.GetCaptureEngine(captureEngineClassFactory);
// Initialize the CaptureEngine
MFCaptureEngineOnEventCallback captureEngineOnEventCallback = MFCaptureEngineOnEventCallback.GetInstance();
mff.Initialize(captureEngine, captureEngineOnEventCallback, mediaSource);
captureEngineOnEventCallback.WaitUntilInitialized();
// Create a Photo Sink
capturePhotoSink = mff.CreateCapturePhotoSink(captureEngine);
// Create a Photo Media Type
photoMediaType = CreatePhotoMediaType(mediaType);
// Remove all streams
mff.RemoveAllStreams(capturePhotoSink);
// Add Stream
int sinkStreamIndex = mff.AddStream(capturePhotoSink, streamIndex, photoMediaType);
// Set output filename
mff.SetSampleCallback(capturePhotoSink, this);
// Take photo
mff.TakePhoto(captureEngine);
captureEngineOnEventCallback.WaitUntilDone();
// imageSource should be filled in after executing TakePhoto
return image;
}
finally
{
TryRelease(captureEngineClassFactory);
TryRelease(captureEngine);
TryRelease(capturePhotoSink);
TryRelease(photoMediaType);
}
Комментарии:
1. Вы можете приблизиться к тому, что делает приложение камеры, используя WinRT вместо MF: blogs.windows.com/windowsdeveloper/2019/09/16/… (не проверено)
2. Я переписал программу для создания снимков с помощью MediaCapture (WinRT). Проблема по-прежнему сохраняется на устройстве Surface Pro 7: снимок передержан. Есть ли вероятность, что исходный код приложения для камеры Windows доступен? Приложение камеры Windows должно использовать другие настройки, поскольку оно всегда делает правильно выставленные снимки.
3. Док здесь docs.microsoft.com/en-us/windows/uwp/audio-video-camera/… и официальный пример кода, похожий на него, есть github.com/microsoft/Windows-universal-samples/tree/main/… если вы не видите элемента управления экспозицией, яркостью или другими функциями, это означает, что он не доступен поставщику HW. Вы можете проверить это с помощью MediaCapture.VideoDeviceController.ExposureControl. Поддерживается и т.д.