#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/…