Я пытаюсь получить снимок видео Rtsp в приложении uwp. Для воспроизведения видео я использую библиотеку vlc.MediaElement (любые предложения о лучших библиотеках для этого приветствуются).
В настоящее время я получаю снимок видео с помощью этого метода:
private async void PhotoButton_Click(object sender, RoutedEventArgs e)
{
Media.Pause();
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(Media, ((int)Media.Width / 2), ((int)Media.Height / 2));
ImgPreview.Source = renderTargetBitmap;
Media.Play();
}
Результат в элементе ImgPreview приличный, однако, когда я иду, чтобы сохранить это в файл с этой функцией:
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
try
{
StorageLibrary lib = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
StorageFolder folder = lib.SaveFolder;
StorageFile file = await folder.CreateFileAsync("TestPhoto_" + DateTime.Now.Ticks + ".jpg", CreationCollisionOption.GenerateUniqueName);
DisplayInformation display = DisplayInformation.GetForCurrentView();
RenderTargetBitmap rtb = new RenderTargetBitmap();
await rtb.RenderAsync(ImgPreview);
IBuffer pixels = await rtb.GetPixelsAsync();
DataReader data = DataReader.FromBuffer(pixels);
byte[] bytes = new byte[pixels.Length];
data.ReadBytes(bytes);
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)rtb.PixelWidth,
(uint)rtb.PixelHeight,
display.RawDpiX,
display.RawDpiY,
bytes);
await encoder.FlushAsync();
storage.doPut(file.Path, file.Name);
}
}
catch (Exception ex)
{
}
}
Результат получился очень размытым, и для моего приложения мне нужно изображение более высокого качества.
Я пытался поиграться с dpi, но единственным результатом была полностью смещенная карта пикселей с странными диагональными полосами.
Есть ли способ решить эту проблему?
Спасибо за любую помощь.