Я пишу приложение C# в Visual Studio, которое воспроизводит видео с помощью DirectShow (Quartz.dll). Одна из проблем, с которой я столкнулась, - вернуть видео в начало, когда пользователь нажимает кнопку остановки, чтобы остановить воспроизведение видео. Другая проблема заключается в очистке последнего кадра видео от элемента управления picturbox.C# Как очистить видео из управления фотобарабаном, когда видео закрыто, и сбросить позицию воспроизведения видео, чтобы начать, когда воспроизведение видео остановлено?
Вот код в верхней части, связанной с QuartzTypeLib:
public partial class frmMain : Form
{
public const int WS_CHILD = 0x40000000;
public const int WS_CLIPCHILDREN = 0x2000000;
public QuartzTypeLib.IMediaControl mc;
public QuartzTypeLib.IVideoWindow videoWindow = null;
Вот код для открытия файла, в том числе код для создания экземпляра FileGraphManager:
private void openMediaToolStripMenuItem_Click(object sender, EventArgs e)
{
// Open a media file.
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Video Files|*.mpg;*.avi;*;*.wmv;*.mov|Audio Files|*.mp3;*.wav;*.wma";
ofd.FilterIndex = 1;
if (DialogResult.OK == ofd.ShowDialog())
{
// Stop the playback for the current video if one is currently playing.
if (mc != null)
mc.Stop();
if (pbVideoDisplay.Image != null)
pbVideoDisplay.Image = null;
// Load the movie file.
FilgraphManager graphManager = new FilgraphManager();
graphManager.RenderFile(ofd.FileName);
mc = (IMediaControl)graphManager;
// Send the video to the picture box control pbVideoDisplay) on frmMain.
try
{
videoWindow = (IVideoWindow)graphManager;
videoWindow.Owner = (int)pbVideoDisplay.Handle;
videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
videoWindow.SetWindowPosition(
pbVideoDisplay.ClientRectangle.Left,
pbVideoDisplay.ClientRectangle.Top,
pbVideoDisplay.ClientRectangle.Width,
pbVideoDisplay.ClientRectangle.Height);
}
catch
{
}
}
}
Вот код для закрытия среды:
private void closeMediaToolStripMenuItem_Click(object sender, EventArgs e)
{
mc.Stop();
}
И вот код для остановки видео Воспроизведение:
private void tsbtnStop_Click(object sender, EventArgs e)
{
mc.Stop();
}
mc.Stop() будет остановить видео на текущем месте видео, это так же, как функция mc.Pause() делает. Как сбросить позицию видео в начале видео при вызове mc.Stop()? И как я могу очистить этот последний видеокадр из элемента управления фотокамерой? Я попробовал «pbVideoDisplay.Image = null;» но последний видеокадр сохраняется. Очевидно, мне нужно больше кода для закрытия видео, но я не могу найти ни одного образца.
«videoWindow.put_Visible» дает мне это: «Ошибка 1 QuartzTypeLib.IVideoWindow» не содержит определение для „put_Visible“ и не метода расширения „put_Visible“ принимающего первый аргумент типа „QuartzTypeLib.IVideoWindow“ может быть найденный." «(mc as IMediaPosition) .put_CurrentPosition» дает мне следующее: «Ошибка 1« QuartzTypeLib.IMediaPosition »не содержит определения для« put_CurrentPosition », и никакой метод расширения« put_CurrentPosition », принимающий первый аргумент типа« QuartzTypeLib.IMediaPosition », может быть найденный." – manicdrummer
Ну, это, видимо, есть, но это может немного отличаться в зависимости от импорта interop (например, свойство «Видимое»). Вы можете использовать Object Browser, чтобы очистить это, или, скорее, использовать [DirectShow.NET] (http://directshownet.sourceforge.net/) в качестве оболочки. –
ОК, я узнал, как очистить последний видеофрагмент из окна изображения. Теперь, как установить текущую позицию видео в начало видео, когда пользователь нажимает кнопку «Стоп»? Пока у меня есть «mc.Stop()»; теперь мне нужен код для сброса видео в начало. – manicdrummer