Документация C# о том, как добавить обработчик событий
Я кодирую видео конвертер, используя NRECO и ffmpeg, все работает, но когда дело доходит до времени выполнения, я попробовал
pgbConversion.Value = FFMpegConverter.ConvertProgress();
но это невозможно, поэтому я получил! ** **ConvertProgress является четным; пожалуйста, проверьте документацию C# о том, как добавить четный обработчик.****
от NReco, пожалуйста, как я могу получить прогресс видео, зная, что ConvertProgrss это событие
2 ответа
Вы пишете это:
FFMpegConverter.ConvertProgress +=
Ваша Visual Studio начинает помогать вам, предлагая присоединить код обработчика события к событию ConvertProgress. Он покажет вам всплывающее окно, как это делает MY visual studio на этом скриншоте, где я прикрепляю обработчик события к событию Timer.Elapsed, которое является совершенно другим событием, для другого объекта, который я использую как Пример, демонстрирующий, как Visual Studio помогает вам прикреплять события к вещам:
Затем вы нажимаете TAB в ВАШЕЙ визуальной студии, чтобы принять предложение во всплывающем окне.
Visual Studio создаст для вас основной обработчик событий, и вы сможете добавить в него свой код, который вы хотите запускать при каждом возникновении события. Вот что сделала моя визуальная студия, когда я нажал tab во время добавления обработчика событий в мой пример с помощью Timer:
(Естественно мои фото показывают, что VS создает обработчик для Timer.Elapsed, а не FFMpegConverter.ConvertProgress, потому что у меня есть Timer, но у меня нет этого класса FFMpegConverter.. "Картинки приведены только для иллюстрации - вы НЕ должны печатать код вы видите на моих фотографиях ")
Вы уверены, что это не опечатка, и они означают "Событие"? В этом случае я бы назначил лямбда-выражение для события, или вы могли бы просто сослаться на другой метод, как показано ниже, поэтому документация будет здесь: Лямбда-выражения, События.
Пример без лямбды:
static void Main(string[] args)
{
var ffMpeg = new FFMpegConverter();
ffMpeg.ConvertProgress += FfMpeg_ConvertProgress;
ffMpeg.ConvertMedia("input.mov", "output.mp4", Format.mp4);
}
private static void FfMpeg_ConvertProgress(object sender, ConvertProgressEventArgs e)
{
// Percent complete as a double
pgbConversion.Value = e.Processed.TotalSeconds / e.TotalDuration.TotalSeconds;
}
Пример с лямбда-выражением:
static void Main(string[] args)
{
var ffMpeg = new FFMpegConverter();
ffMpeg.ConvertProgress += (s, e) => {
pgbConversion.Value = e.Processed.TotalSeconds / e.TotalDuration.TotalSeconds;
};
ffMpeg.ConvertMedia("input.mov", "output.mp4", Format.mp4);
}
Событие имеет только общее количество секунд в видео и количество секунд, которые были обработаны. Они также представлены как объекты TimeSpan. Я бы посоветовал получить общее количество секунд каждого из них (возвращая двойное число), а затем разделить, чтобы получить процент завершения. Конечно, вы можете использовать любой из них как экземпляры TimeSpan по отдельности.