Документация 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 по отдельности.

Другие вопросы по тегам