Сделайте Снимок потокового видео Rtsp в UWP - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь получить снимок видео 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, но единственным результатом была полностью смещенная карта пикселей с странными диагональными полосами.

Есть ли способ решить эту проблему? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 09 июля 2019

Результат получился очень размытым, и для моего приложения мне нужно изображение более высокого качества.

Я проверил ваш код и обнаружил, что вы получаете RenderTargetBitmap из ImgPreview , в этом нет необходимости, вы можете использовать MediaElement RenderTargetBitmap напрямую, чтобы избежать потери качества изображения.

И вы получите половину размера RenderTargetBitmap со следующим, что приведет к низкому качеству изображения.

await renderTargetBitmap.RenderAsync(Media, ((int)Media.Width / 2), ((int)Media.Height / 2));

Пожалуйста, используйте полный размер.

 await renderTargetBitmap.RenderAsync(Media, ((int)Media.Width), ((int)Media.Height));

 ......

 private RenderTargetBitmap renderTargetBitmap;
 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();                 
         IBuffer pixels = await renderTargetBitmap.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)renderTargetBitmap.PixelWidth,
                 (uint)renderTargetBitmap.PixelHeight,
                 display.RawDpiX,
                 display.RawDpiY,
                 bytes);

             await encoder.FlushAsync();

             //storage.doPut(file.Path, file.Name);
         }
     }
     catch (Exception ex)
     {

     }

 }
...