Опираясь на видео в С#

Я делаю приложение, которое позволит пользователям применять определенные инструменты для анализа видео и изображений. Мне нужна помощь в том, как я actaully рисую/пишу на видео, загруженном в медиаплеер Windows, в моей форме и сохраняю его. Он должен быть в состоянии заставить пользователя рисовать от руки и фигуры на нем. Спасибо, Advance,

Крис:)

Ответ 1

Это нетривиальная, если не невозможная задача для выполнения с помощью wmp-управления в winforms.

Я не знаю, как можно нарисовать wmp, но вы можете нарисовать прозрачную панель, наложенную поверх wmp. Это не будет работать, будет воспроизводиться видео, но вы можете показать рисунок, пока он приостановлен. Я использовал эту технику для привлечения стороннего видеоконтроля, который работает аналогично wmp. (Edit - это, похоже, не работает с элементом управления wmp)

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

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

Я бы настоятельно рекомендовал вам использовать WPF (даже если его элемент управления wpf размещен в приложении winforms) для показа вашего видео. В wpf гораздо проще рисовать видео (включая воспроизведение видео).

ИЗМЕНИТЬ

Я только что проверил рисунок поверх wmp с помощью прозрачной панели, и он не ведет себя как мой сторонний элемент управления, поэтому я предлагаю вам сделать бит для воспроизведения видео в WPF и host, который находится в вашем приложении winforms. (Я просто тестировал это тоже, используя предложение @Callums inkcanvas, и оно работает как шарм)

Ответ 2

Если вы используете WPF, попробуйте размещение an InkCanvas поверх видео и настройки Background на прозрачность. Затем вы можете сохранять и загружать фигуры, которые пользователи рисуют поверх видео.

Небольшое доказательство концепции с изображением вместо видео:

alt text

Я подозреваю, что вы можете использовать WinForms, хотя это может быть сложнее. Если это так, хороший повод для изучения WPF!


РЕДАКТИРОВАТЬ: В WinForms вам нужно будет создать собственный пользовательский элемент управления, который будет действовать как прозрачный оверлей и добавить к нему мазки кисти. Было бы очень сложно реализовать хорошо (с прозрачным фоном, который не очень хорошо работает с WinForms). Я бы рекомендовал использовать WPF, если вы все еще на этапе, вы можете изменить свой интерфейс приложения. WPF работает на XP и выше.


EDIT2: После поиска в Интернете есть некоторые эквиваленты InkCanvas, которые люди сделали для WinForms, но у меня есть не знаю, насколько они хороши и могут не поддерживать прозрачные фоны.

У вас всегда может быть видео, которое вы хотите аннотировать в новом окне WPF, а остальное приложение в WinForms.

Ответ 3

Это можно сделать в WinForms, но это непросто. Существует поддержка прозрачной формы с альфа-смешиванием в WinForms. Используйте следующие CreateParams для прозрачной формы наложения: WS_EX_LAYERED, WS_EX_TRANSPARENT. Проверьте ссылки MSDN для этого типа окна: http://msdn.microsoft.com/en-us/library/ms997507.aspx, http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#layered.

Поместите прозрачную форму над вашим видеоконтролем, и вы можете нарисовать на ней что угодно. Перемещение и изменение размера событий необходимо согласовать между вашим видеоокнором и прозрачной формой над ним. Для перерисовки наложения необходимо использовать UpdateLayeredWindow() в user32.dll.

В этом примере я узнал немного: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel.

Ответ 4

Вы можете посмотреть на XNA (www.xna.com) от Microsoft. Он создан для управляемых языков, таких как С#, и должен поддерживать видео.

Я использовал его только для рисования в С#, но он выполняет свою работу.

Следует также отметить, что XNA будет функционировать как часть обычного приложения Windows Forms. Для чего это стоит, я также прототипировал что-то вроде этого с помощью Flash; Flash позволяет импортировать каждый кадр файла фильма в редактор и создавать SWF, который может реагировать на взаимодействие пользователя.

Однако этот подход бесполезен, если вам нужно обновить фильм в режиме реального времени. Flash (последний раз, когда я проверил) мог импортировать фильм только в дизайн.

Ответ 5

Я нашел, как это сделать.
Вот один из способов использования WPF с помощью Canvas

private void buttonPlayVideo_Click(object sender, RoutedEventArgs e)
{
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
    dlg.Filter = "All Files|*.*";
    Nullable<bool> result = dlg.ShowDialog();
    if (result == true) {
        MediaPlayer mp = new MediaPlayer();
        mp.Open(new Uri(filename));
        VideoDrawing vd = new VideoDrawing();
        vd.Player = mp;
        vd.Rect = new Rect(0, 0, 960, 540);
        DrawingBrush db = new DrawingBrush(vd);
        canvas.Background = db;
        mp.Play();
    }
}

затем создайте события мыши для холста и рисуйте с ним

Point startPoint, endPoint;
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
    startPoint = e.GetPosition(canvas);
}
private void canvas_MouseUp(object sender, MouseButtonEventArgs e)
{
    endPoint = e.GetPosition(canvas);

    Line myLine = new Line();
    myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
    myLine.X1 = startPoint.X;
    myLine.Y1 = startPoint.Y;
    myLine.X2 = endPoint.X;
    myLine.Y2 = endPoint.Y;
    myLine.HorizontalAlignment = HorizontalAlignment.Left;
    myLine.VerticalAlignment = VerticalAlignment.Center;
    myLine.StrokeThickness = 2;
    canvas.Children.Add(myLine);
}

Ответ 6

Хорошо, безусловно, лучший способ сделать это - использовать Silverlight. Silverlight поддерживает все основные форматы потоковой передачи, а также обеспечивает полный доступ к фреймбуферу.

Легко: -)