LibVLCSharp: как остановить приложение при закрытии проигрывателя

#c# #libvlcsharp

Вопрос:

Я пытаюсь написать простое приложение для плеера, используя LibVLCSharp, и мне интересно, как остановить приложение, когда плеер закрывается. В настоящее время он просто зависает и не останавливает приложение, хотя я добавил SetExitHandler обратный вызов.

 using System;
using System.Threading;
using LibVLCSharp.Shared;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Core.Initialize();

            using var libVlc = new LibVLC();
            using var mediaPlayer = new MediaPlayer(libVlc);
            libVlc.SetExitHandler(() =>
            {
                Environment.Exit(1);
            });

            var media = new Media(libVlc, "v4l2:///dev/video0", FromType.FromLocation);
            media.AddOption(":v4l2-standard=ALL :live-caching=300");

            mediaPlayer.Play(media);
            Thread.Sleep(TimeSpan.FromSeconds(10));
        }
    }
}
 

Войдите в систему после того, как я закрою окно:

 [00007fa164004790] gl gl: Initialized libplacebo v2.72.0 (API v72)
[00007fa17400a7c0] main decoder error: buffer deadlock prevented
[00007fa1600429a0] xcb_window window error: X server failure
 

Комментарии:

1. Помогает ли вам это MediaPlayer.EndReached мероприятие?

2. @JonSkeet только что попробовал. Не повезло, то же самое поведение. Я даже удалил свой SetExitHandler обратный звонок. Кстати, спасибо вам огромное за всю вашу помощь с C#, и ваша книга потрясающая!

3. Рад, что смог помочь на этом фронте — давайте посмотрим, смогу ли я помочь и на фронте VLC. (Я сам использую эту библиотеку для чего-то в данный момент.) Теперь… с точки зрения других событий, на которые вы, возможно, захотите взглянуть, есть EncounteredError или Stopped выросли? Тот факт, что вы видите ошибки в журнале, немного настораживает, как будто LibVLC не совсем правильно обрабатывает закрытие 🙁

4. Это вроде как работает. Иногда он останавливает приложение через 30 секунд после закрытия окна. Иногда нет. Я думаю, что происходит какой-то тупик.

5. @Узел. JS Еще кое-что, что я заметил, это то, что вы используете ExitHandler LibVLV. Но библиотека не выходит, когда видео останавливается. Вы можете использовать медиаплеер. Завершенное событие. Это сработает, когда видео закончится.

Ответ №1:

Следующий пример кода со страницы LibVLCSharp на GitHub показывает, как воспроизводить видео в консольном приложении.

 Core.Initialize();

using var libvlc = new LibVLC(enableDebugLogs: true);
using var media = new Media(libvlc, new Uri(@"C:tmpbig_buck_bunny.mp4"));
using var mediaplayer = new MediaPlayer(media);

mediaplayer.Play();

Console.ReadKey();
 

Обратите внимание на использование Console.ReadKey() функции ожидания нажатия пользователем клавиши перед закрытием приложения и последующим закрытием проигрывателя.

Чтобы автоматически выйти из приложения по окончании видео, вы можете использовать MediaPlayer.Завершенное событие, как показано здесь:

 Core.Initialize();

using var libvlc = new LibVLC(enableDebugLogs: true);
using var media = new Media(libvlc, new Uri(@"C:tmpbig_buck_bunny.mp4"));
using var mediaplayer = new MediaPlayer(media);
mediaplayer.EndReached  = (s, e) => Environment.Exit(0);

mediaplayer.Play();

Console.ReadKey();
 

Комментарии:

1. Мы знаем EndReached , что это должно сработать, но есть более серьезная проблема тупика.

2. @Узел. JS не могли бы вы описать проблему немного подробнее? Из вашего первоначального вопроса следует, что использование потока. Проблемы были вызваны сном и LibVLC.SetExitHandler. Каково именно поведение при использовании MediaPlayer. Мечтал? Как долго длится видео, с которым вы тестируете? Что происходит с приведенным выше кодом, когда вы нажимаете клавишу во время воспроизведения видео? Закрывается ли окно VLC и останавливается ли приложение?

3. Я подтверждаю, что приведенный выше код является точным. Обработчик выхода не для того, что вы думаете videolan.videolan.me/vlc/…