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