Требуется много времени, чтобы остановить VlcMediaPlayer - PullRequest
0 голосов
/ 04 октября 2019

У меня есть простое приложение WPF. Приложение записывает поток RTSP в файл. Для этого используется библиотека Vlc.DotNet.

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

Код приложения приведен ниже.

public partial class MainWindow : Window
{
    private IPath _pathWrapper;
    private IDirectoryInfo _vlcLibDirectory;
    private VlcMediaPlayer _videoRecorder;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnButtonClick(object sender, RoutedEventArgs e)
    {
        if (_videoRecorder != null && _videoRecorder.IsPlaying())
        {
            _videoRecorder.Stop();
            Button.Background = Brushes.Blue;
            _videoRecorder = null;
            return;
        }

        string currentDirectory = AppDomain.CurrentDomain.BaseDirectory;
        _pathWrapper = new PathWrap();
        _vlcLibDirectory = new DirectoryInfoWrap(_pathWrapper.Combine(currentDirectory, "libvlc", IntPtr.Size == 4 ? "win-x86" : "win-x64"));
        var options = new string[]
        {
            "--file-logging",
            "--logfile=OnvifVideoRecording.log",
            "-vvv"
        };
        _videoRecorder = new VlcMediaPlayer(_vlcLibDirectory.DirectoryInfo, options);

        //string fileDestination = "\\\\\\BuildSrv\\Videos\\A, A, 1\\test.mp4";
        string fileDestination = @"D:\Media\Video\A, A, 1\test.mp4";

        if (File.Exists(fileDestination))
        {
            File.Delete(fileDestination);
        }

        string[] mediaOptions =
        {
            ":sout=#file{dst='" + fileDestination + "'}",
            ":sout-keep"
        };

        _videoRecorder.SetMedia("rtsp://192.168.1.110:5504/channel=0,stream=0", mediaOptions);
        _videoRecorder.Play();
        Button.Background = Brushes.Red;
    }
}

Приложение имеет окно. В окне есть кнопка. При первом нажатии этой кнопки начинается запись видеофайла, и кнопка становится красной. Я обычно записываю видеофайлы в течение 10 минут. При повторном нажатии кнопки запись видеофайла прекращается, и кнопка становится синей.

Если я записываю файл в локальный пункт назначения (например, на тот же компьютер, на котором выполняется программа), D: \ Media \ Video \ A, A, 1 \ test.mp4), все в порядке. Запись видеофайла начинается и останавливается быстро, почти сразу.

Проблемы возникают при попытке записи файла на удаленный компьютер (например, \ BuildSrv \ Videos \ A, A, 1 \ test.mp4). Запись видео файла начинается немедленно. Однако _videoRecorder.Stop () занимает приблизительно 30 секунд - 1 минуту. Монитор ресурсов показывает очень высокое использование сети (90% в случае одного компьютера и 100% в случае другого) после повторного нажатия кнопки (запись видео останавливается). Чем длиннее записанный видеофайл, тем больше времени требуется для остановки VlcMediaPlayer.

Почему остановка VlcMediaPlayer занимает так много времени в случае записи потока RTSP на удаленный компьютер? Можно ли как-то решить эту проблему?

...