Захватить каждый кадр MediaFlement WPF - PullRequest
1 голос
/ 11 июня 2010

Есть ли способ захвата каждого кадра MediaFlement WPF? Как событие, которое запускается в каждом отображаемом кадре и позволяет мне получить к нему доступ. Если MediaElement не предоставляет такую ​​функциональность, как она может быть реализована или какой другой элемент управления я могу использовать? Кстати, есть ли такой элемент управления или метод, который бы позволял быструю рендеринг медиа-клипов за кадром с захватом кадров? (чтобы я мог обрабатывать кадры максимально быстро)

Ответы [ 3 ]

3 голосов
/ 12 июня 2010

Попробуйте мой WPF MediaKit проект.Позволяет вам делать практически все что угодно в WPF с Media.Попробуйте MediaDetector.cs, он позволяет вам извлекать кадры из любого времени на носителе.Это немного глючит, так как я никогда не трачу на это много времени, но должно работать на то, что вам нужно.

0 голосов
/ 07 июня 2019

Если вы используете свое воображение, возможно, этот фрагмент может дать вам несколько идей:

MediaPlayer player = new MediaPlayer();
player.Open(new Uri(_inputFilename));
player.ScrubbingEnabled = true;
DrawingVisual dv = new DrawingVisual();
for (int i = 0; i < session.FramesList.Count; i++)
{
    Frame f = session.FramesList[i];
    player.Position = new TimeSpan((long)(f.Time * 10000000));
    using (DrawingContext dc = dv.RenderOpen())
    {
        dc.DrawVideo(player, new Rect(0, 0, 1024, 576));
    }
    RenderTargetBitmap bmp = new RenderTargetBitmap(1024, 576, 96, 96, PixelFormats.Pbgra32);
    bmp.Render(dv);
    f.Thumbnail = bmp.GetAsFrozen() as ImageSource;
    framesListView.Dispatcher.Invoke(() => FramesList.Add(f));
}
0 голосов
/ 12 июня 2010

Нет встроенного способа WPF:

  • MediaElement не имеет этой способности.
  • BitmapDecoder имеет API для запроса этого, но использование BitmapDecoder для извлечения кадров из произвольного носителя не реализовано: он может извлекать кадры только из нескольких анимированных растровых форматов, таких как .gif.

Мне удалось получить изображения кадров из .mpg, .wmv, .mov, .flv, .avi и других форматов фильмов с помощью DirectShow. Я построил граф фильтров, используя интерфейсы построителя графов COM DirectShow. Полученный график фильтра декодировал фильм и связывал его с настраиваемым фильтром рендеринга, написанным на C #. Мой пользовательский фильтр получил данные кадра и преобразовал их в объекты BitmapSource для отображения с помощью BitmapSource.Create.

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

...