Как я могу обновить фрейм проигрывателя Windows Media COM? - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть Windows Media Player COM в моем проекте Windows Form, который превосходно воспроизводит и открывает видео.Однако я хотел бы иметь возможность получить первый кадр загруженного видео, чтобы пользователи моей программы могли просматривать видео (и, в идеале, распознавать одно видео из другого).

Как обновить отображаемый кадробъектом проигрывателя Windows Media?

Я пытался использовать следующий код в конце моего ответа на событие openFileDialog:

private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
    Text = openFileDialog1.SafeFileName + " - MPlayer 2.0";
    //mediaPlayer1.openPlayer(openFileDialog1.FileName);
    mediaPlayer1.URL = openFileDialog1.FileName;
    //hopefully, this will load the first frame.
    mediaPlayer1.Ctlcontrols.play();
    mediaPlayer1.Ctlcontrols.pause();           
}

Однако, когда я запускаю это, команда паузы игнорируется(Авто-воспроизведение для загрузки видео отключено, поэтому видео не начнет воспроизводиться без вызова .play (), выше).Если бы мне пришлось угадывать, я бы сказал, что это из-за какой-то операции с потоками, которая вызывает воспроизведение, переходит к паузе вызова, вызывает паузу, а затем, наконец, воспроизведение разрешается, и начинается видео - но потому что .pauseразрешенный до .play, чистый эффект - это .pause, в конечном счете, не учитывается.

Во-первых, есть ли способ, отличный от .play ();.Пауза();получить изображение для предварительного просмотра видео для объекта AxWindowsMediaPlayer?Если нет, то как я могу убедиться, что мой .pause () не игнорируется?

(я знаю, что .play(); .pause(); работает в случае general , потому что я тестировал сотдельная кнопка, которая вызывала эти два метода после , когда видео закончило загрузку, и оно работало, как и ожидалось)

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Хотя Windows Media Player Com может не официально поддерживать такую ​​функцию, ее довольно легко «подделать».Если вы используете CtlControls2, у вас есть доступ к встроенной функции «step (1)», которая обрабатывает ровно один кадр.

Я обнаружил, что если вы вызываете step (1) после вызова pause () , поиск на трекбар также обновит видео.

Это не красиво, но работает!

2 голосов
/ 23 сентября 2011

Вы не можете сделать много вещей с этим COM. Однако Перейдите по этой ссылке , и вы найдете класс, который поможет вам извлечь изображение из видеофайла. Вы можете просто извлечь изображение и просто поместить его в верхней части видео или рядом с ним. Это простой обходной путь для вашего требования. Если вас это не устраивает, я настоятельно рекомендую вообще не использовать этот COM и использовать некоторые другие видео плееры / плагины с открытым исходным кодом. Там действительно много хороших, но я мог бы порекомендовать VLC Plugin или попробовать найти другой.

Удачи в твоих поисках.

Hanlet

1 голос
/ 25 января 2018

Это небольшой трюк для решения общей проблемы (-1), не работающей проблемы.

IWMPControls2 Ctlcontrols2 = (IWMPControls2)WindowsMediaPlayer.Ctlcontrols;

double frameRate = WindowsMediaPlayer.network.encodedFrameRate;
Console.WriteLine("FRAMERATE: " + frameRate); //Debug
double step = 1.0 / frameRate;
Console.WriteLine("STEP: " + step); //Debug
WindowsMediaPlayer.Ctlcontrols.currentPosition -= step; //Go backwards
WindowsMediaPlayer.Ctlcontrols.pause();
Ctlcontrols2.step(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...